首页 > 其他 > 详细

BZOJ 2190: [SDOI2008]仪仗队

时间:2017-07-27 18:09:44      阅读:284      评论:0      收藏:0      [点我收藏+]
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;
}

 

BZOJ 2190: [SDOI2008]仪仗队

原文:http://www.cnblogs.com/ruojisun/p/7245914.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!