题意:给你一个n,然后求从2-->n的所有数的欧拉函数的和。
View Code
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 6 using namespace std; 7 8 #define MAXN 1000010 9 10 long long euler[MAXN],sum_euler[MAXN];//sum_euler[i]表示2-->i的欧拉数和 11 int n; 12 void get_euler() 13 { 14 int i,j; 15 euler[1]=1; 16 for(i=2;i<MAXN;i++) 17 euler[i]=i; 18 for(i=2;i<MAXN;i++) 19 if(euler[i]==i)//这里满足的肯定是素数 20 { 21 for(j=i;j<MAXN;j+=i)//更新含有它的数 22 euler[j]=euler[j]/i*(i-1);//:p(n)=n*(1-1/p1)*(1-1/p2)....*(1-1/pk) 23 } 24 } 25 26 int main() 27 { 28 get_euler(); 29 sum_euler[1]=0;//注意这里是2-->i的欧拉数和,所以为0 30 for(int i=2;i<MAXN;i++) 31 sum_euler[i]=sum_euler[i-1]+euler[i]; 32 while(scanf("%d",&n) && n) 33 { 34 printf("%I64d\n",sum_euler[n]); 35 } 36 return 0; 37 }