bzoj2190 [SDOI2008]仪仗队 - 筛法 - 欧拉函数
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
Hint
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
题解:
题目中发现,只有横坐标和纵坐标互质才可以看见,这个就是欧拉函数吧,1-n的然后*2,加上斜对角线那个1
就ok了。
1 #include<cstring> 2 #include<cmath> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdio> 6 #define N 40007 7 using namespace std; 8 9 int n; 10 int phi[N],prime[N],cnt,ans; 11 bool mark[N]; 12 13 void prime_phi() 14 { 15 phi[1]=1; 16 for (int i=2;i<=n;i++) 17 { 18 if (!mark[i]) 19 { 20 prime[++cnt]=i; 21 phi[i]=i-1; 22 } 23 for (int j=1;j<=cnt&&prime[j]*i<=n;j++) 24 { 25 int t=prime[j]*i; 26 mark[t]=1; 27 if (i%prime[j]==0) 28 { 29 phi[t]=phi[i]*prime[j]; 30 break; 31 } 32 else phi[t]=phi[i]*(prime[j]-1); 33 } 34 } 35 } 36 int main() 37 { 38 scanf("%d",&n); 39 prime_phi(); 40 for (int i=1;i<n;i++) 41 ans+=phi[i]; 42 printf("%d",2*ans+1); 43 }