BZOJ 2190: [SDOI2008]仪仗队
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; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。