码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 2190: [SDOI2008]仪仗队

时间:2017-07-27 18:34:31      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:problem   style   一个   com   mit   discus   log   技术分享   output   

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]仪仗队

标签:problem   style   一个   com   mit   discus   log   技术分享   output   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!