【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 }

 

posted @ 2017-09-17 12:52  noble_(noblex)  阅读(235)  评论(0编辑  收藏  举报
/* */