poj2478 Farey Sequence

求∑φ(i),i ≤ n。

根据欧拉函数的定义,当a,b互质时,φ(ab)=φ(a)φ(b),若b|a且b是素数,则φ(ab)=b*φ(a)。

用素数筛法预处理出1e6之内的所有素数和欧拉函数。

 

http://poj.org/problem?id=2478

 

 

 1 #include <cstdio>
 2 #include <cstring>
 3 typedef __int64 LL;
 4 using namespace std;
 5 const int maxn = 1e6 + 10;
 6 LL f[maxn];
 7 int prime[maxn], k;
 8 bool vis[maxn];
 9 int n;
10 
11 void init(){
12     memset(vis, 0, sizeof vis);
13     k = 0;
14     for(int i = 2; i <= 1e6; i++){
15         if(!vis[i]){
16             prime[k++] = i;
17             f[i] = i - 1;
18         }
19         for(int j = 0; j < k && prime[j] * i <= 1e6; j++){
20             vis[prime[j] * i] = 1;
21             if(i % prime[j] == 0){
22                 f[i * prime[j]] = prime[j] * f[i];
23                 break;
24             }
25             else f[i * prime[j]] = f[i] * (prime[j] - 1);
26         }
27     }
28     f[0] = 0;
29     for(int i = 1; i <=  1e6; i++) f[i] += f[i - 1];
30 }
31 
32 int main(){
33     init();
34     while(~scanf("%d", &n) && n) printf("%I64d\n", f[n]);
35     return 0;
36 }
View Code

 

posted @ 2015-09-14 09:59  astoninfer  阅读(154)  评论(0编辑  收藏  举报