HDU 1215 七夕节
Posted jpphy0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1215 七夕节相关的知识,希望对你有一定的参考价值。
0 链接
HDU 1215 七夕节 - http://acm.hdu.edu.cn/showproblem.php?pid=1215
1 分析
- 枚举约数,复杂度 O ( T ⋅ n ) O(T\\cdot\\sqrt{n}) O(T⋅n)
- 埃氏筛法,复杂度 O ( n ⋅ log ( n ) + T ) O(n\\cdot \\log(n)+T) O(n⋅log(n)+T)
- 线性筛法,复杂度
O
(
n
+
T
)
O(n+T)
O(n+T),利用除数和函数
σ
(
n
)
\\sigma(n)
σ(n) 计算
σ ( n ) = σ ( p 1 α 1 ⋯ p r α r ) = ∑ d ∣ n d = ∏ i = 1 r p i α i + 1 − 1 p i − 1 \\sigma(n)=\\sigma(p_1^{\\alpha_1}\\cdots p_r^{\\alpha_r})=\\sum_{d|n}d=\\prod_{i=1}^{r}\\frac{p_i^{\\alpha_i+1}-1}{p_i-1} σ(n)=σ(p1α1⋯prαr)=d∣n∑d=i=1∏rpi−1piαi+1−1
2 代码
枚举约数【358MS】
// hdu 1215 七夕节
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, t, ans;
scanf("%d", &t);
while(t--){
ans = 1;
scanf("%d", &n);
for(int i = 2; i*i <= n; ++i){
if(n % i == 0){
ans += i;
if(i*i < n) ans += n/i;
}
}
printf("%d\\n", ans);
}
return 0;
}
埃氏筛法【93MS】
// hdu 1215 七夕节
#include<bits/stdc++.h>
using namespace std;
#define MXN 500010
int d[MXN];
void init(){
for(int i = 1; i < MXN; ++i){
for(int j = i+i; j < MXN; j += i){// i不能是i的约数,只能是2i、3i、…的约数
d[j] += i;
}
}
}
int main(){
int n, t;
init();
scanf("%d", &t);
while(t--){
scanf("%d", &n);
printf("%d\\n", d[n]);
}
return 0;
}
线性筛法【78MS】
// hdu 1215 七夕节
#include<bits/stdc++.h>
using namespace std;
#define MXN 500010
int prim[MXN], vis[MXN], cnt, d[MXN];
void init(){
int p;
cnt = 0;
memset(vis, 0, sizeof vis);
for(int i = 2; i < MXN; ++i){
if(vis[i] == 0){
prim[++cnt] = i, vis[i] = i;
for(int j = i; j < MXN; j *= i){
vis[j] = i;
d[j] = (j*i-1)/(i-1);
if( j > MXN/i) break;
}
}
for(int j = 1; j <= cnt; ++j){
if(prim[j] >= vis[i] || i > MXN/prim[j]) break;
p = prim[j];
for(int k = i*prim[j]; k < MXN; k *= prim[j]){
p *= prim[j], vis[k] = prim[j];
d[k] = d[i]*(p-1)/(prim[j]-1);
if(k > MXN/prim[j]) break;
}
}
}
}
int main(){
int n, t;
init();
scanf("%d", &t);
while(t--){
scanf("%d", &n);
printf("%d\\n", d[n]-n);
}
return 0;
}
以上是关于HDU 1215 七夕节的主要内容,如果未能解决你的问题,请参考以下文章