题目描述
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。现在,C君希望你告诉他队伍整齐时能看到的学生人数。
输入输出格式
输入格式:
共一个数N
输出格式:
共一个数,即C君应看到的学生人数。
输入输出样例
说明
【数据规模和约定】
对于 100% 的数据,1 ≤ N ≤ 40000
Solution
说实话,这道题有点碰巧.
因为把原图中的点的连线通过中间的那条线分开;
会发现,每次多出来的人数就是一个欧拉函数.
所以就直接求就可以了.
这里主要展示一下欧拉函数的代码.
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int ola(int n) 4 { 5 int ans=0,i,k; 6 if(n==1) 7 ans=1; 8 else 9 { 10 ans=n; 11 k=1; 12 for(i=2;n!=1;i+=k) 13 { 14 if(n%i==0) 15 { 16 ans/=i; 17 ans*=(i-1); 18 while(n%i==0) n/=i; 19 i=k; 20 } 21 } 22 } 23 return ans; 24 } 25 int ans,n; 26 int main() 27 { 28 scanf("%d",&n); 29 if(n==1) {cout<<0<<endl;return 0;} 30 for(int i=3;i<=n;++i) 31 ans+=ola(i-1); 32 cout<<ans+3<<endl; 33 return 0; 34 }