BZOJ 2190: [SDOI2008]仪仗队

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 3213  Solved: 2072
[Submit][Status][Discuss]

Description

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

Input

  共一个数N。

Output

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

Sample Input

  4

Sample Output

  9


HINT

 

【数据规模和约定】   对于 100% 的数据,1 ≤ N ≤ 40000

 

Source

 

设左下角坐标为(0,0)

若任意一点坐标为(x,y) 设gcd(x,y)=k,

如果k!=1 ,则 一定会被(x/k,y/k)挡住 所以被看到的必要条件是k==1

问题就变成了 

把棋盘劈成两半 则变成求 

 

 可以看出 括号内的式子就是欧拉函数 

问题变为求欧拉函数的值

屠龙宝刀点击就送

#include <cstdio>

int get_phi(int n)
{
    int ans=n;
    if(n%2==0) 
    {
        while(n%2==0) n/=2;
        ans/=2;
    }
    for(int i=3;i*i<=n;i+=2)
    {
        if(n%i==0)
        {
            while(n%i==0)  n/=i;
            ans=ans/i*(i-1);
        }
    }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}
int n,ans;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
        ans+=i==1?1:get_phi(i);
    printf("%d",ans*2+1);
    return 0;
}

 

posted @ 2017-07-27 17:05  杀猪状元  阅读(124)  评论(0编辑  收藏  举报