仪仗队(欧拉函数模板)
1 long long euler_phi(int n) 2 { 3 int m=(int)sqrt(n+0.5); 4 int ans=n; 5 for(int i=2;i<=m;i++) 6 7 if(n%i==0) 8 { 9 ans=ans/i*(i-1); 10 while(n%i==0) 11 n/=i; 12 } 13 if(n>1)ans=ans/n*(n-1); 14 return ans; 15 }
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
Hint
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include<cmath> 6 #include<sstream> 7 #include<string> 8 using namespace std; 9 long long euler_phi(int n) 10 { 11 int m=(int)sqrt(n+0.5); 12 int ans=n; 13 for(int i=2;i<=m;i++) 14 15 if(n%i==0) 16 { 17 ans=ans/i*(i-1); 18 while(n%i==0) 19 n/=i; 20 } 21 if(n>1)ans=ans/n*(n-1); 22 return ans; 23 } 24 25 int main() 26 { 27 int n; 28 long long sum=0; 29 scanf("%d",&n); 30 for(int i=1;i<n;i++) 31 sum+=euler_phi(i); 32 sum=sum*2+1; 33 printf("%lld\n",sum); 34 return 0; 35 }