BZOJ 2190 (欧拉函数)
2190: [SDOI2008]仪仗队
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<map> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 typedef long long ll; 9 typedef unsigned long long ull; 10 const int N=40005; 11 int phi[N]; 12 int sum[N]; 13 void phi_table() 14 { 15 for(int i=2;i<N;i++) 16 phi[i]=0; 17 phi[1]=1; 18 for(int i=2;i<N;i++) 19 if(!phi[i]) 20 { 21 for(int j=i;j<N;j+=i) 22 { 23 if(!phi[j])phi[j]=j; 24 phi[j]=phi[j]/i*(i-1); 25 } 26 } 27 } 28 int main() 29 { 30 phi_table(); 31 for(int i=1;i<N;i++) 32 sum[i]=sum[i-1]+phi[i]; 33 int n; 34 while(scanf("%d",&n)!=EOF) 35 { 36 if(n==1){puts("0");continue;} 37 printf("%d\n",sum[n-1]*2+1); 38 } 39 return 0; 40 }