仪仗队(codevs 2296)

题目描述 Description

  作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。

  现在,C君希望你告诉他队伍整齐时能看到的学生人数。

 

 

输入描述 Input Description

  共一个数N。

输出描述 Output Description

  共一个数,即C君应看到的学生人数。

样例输入 Sample Input

4

样例输出 Sample Output

9

 

数据范围及提示 Data Size & Hint

对于 30% 的数据,1≤N≤1000

对于 100% 的数据,1≤N≤40000

/*
  对于一个例子,如果我们把符合要求的点找出来,会发现所有点的x-1与y-1互质,且图是对称的,那么我们就可以循环1~n-1,找出小于它们并与它们互质的数,统计个数*2+1,典型的欧拉函数题目。 
*/
#include<cstdio>
#include<iostream>
#define M 40010
using namespace std;
int phi[M],n;
void oula()
{
    for(int i=1;i<=n;i++)
      phi[i]=i;
    for(int i=2;i<=n;i++)
      if(phi[i]==i)
        for(int j=1;j<=n/i;j++)
          phi[i*j]=phi[i*j]/i*(i-1);
}
int main()
{
    scanf("%d",&n);
    oula();
    int ans=0;
    for(int i=1;i<n;i++)
      ans+=phi[i];
    printf("%d",ans*2+1);
    return 0;
} 
View Code

 

posted @ 2016-08-25 16:03  karles~  阅读(193)  评论(0编辑  收藏  举报