【BZOJ】2190 [SDOI2008]仪仗队(欧拉函数)
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
HINT
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
-----------------------------------------------------------------------------------------------------
分析:第一眼看到题,突然想到扩欧(滑稽),但仔细分析一下,站在C君处,如果看见了一个坐标(x,y),此坐标后的(2x,2y)(3x,3y)(4x,4y)(5x,5y)都看不见了,换句话说,只要是x,y不互质的点都看不见。所以题目就变成了求n范围内的互质的数的组数。跑一边欧拉筛法即可。
1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 const int maxn=40000; 5 int phi[maxn]; 6 int phis(int n)//筛法 7 { 8 for(int i=2;i<=n;i++) phi[i]=0; 9 phi[1]=1; 10 for(int i=2;i<n;i++) 11 { 12 if(!phi[i]) 13 for(int j=i;j<=n;j+=i) 14 { 15 if(!phi[j]) phi[j]=j; 16 phi[j]=phi[j]/i*(i-1); 17 } 18 } 19 return 0; 20 } 21 int main() 22 { 23 int n; 24 long long sum=0; 25 scanf("%d",&n); 26 phis(n); 27 for(int i=2;i<=n-1;i++) 28 { 29 sum+=phi[i]; 30 } 31 printf("%lld",sum*2+3);//x,y对称,所以sum*2,加3是因为没算(1,0)(1,1)(0,1) 32 return 0; 33 }