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 }