[模板]洛谷T2158 仪仗队 欧拉函数

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<ctime>
 6 #include<cstdlib>
 7 
 8 #include<string>
 9 #include<stack>
10 #include<queue>
11 #include<vector>
12 #include<algorithm>
13 #include<map>
14 #include<set>
15 
16 #define inf 2147483647
17 #define ri register int
18 #define ll long long
19 
20 using namespace std;
21 
22 inline void read(int &x){
23     x=0;
24     char t=getchar();
25     bool f=0;
26     
27     while(t<'0' || t>'9'){
28         if(t=='-')f=1;
29         t=getchar();
30     }
31     
32     while(t>='0' && t<='9'){
33         x=(x<<3)+(x<<1)+t-'0';
34         t=getchar();
35     }
36     
37     if(f)x=-x;
38 }
39 
40 inline void Euler();
41 
42 int a[40005];  //最小质因数 
43 int pri[10005],p=0;  //质数表 
44 int f[40005];  //phi
45 
46 int n,ans=0;
47 
48 int main(){
49     read(n);
50     
51     n--;
52     
53     Euler();
54     
55     for(ri i=2;i<=n;i++)ans+=f[i];
56     
57     ans=(ans<<1)+3;
58     
59     printf("%d\n",ans);
60     
61     return 0;
62 }
63 
64 inline void Euler(){
65     for(ri i=2;i<=n;i++){
66         if(!a[i]){
67             p++;
68             pri[p]=i;
69             a[i]=i;
70         }
71         
72         for(ri j=1;j<=p && i*pri[j]<=n;j++){
73             a[i*pri[j]]=pri[j];
74             if(i%pri[j]==0)break;
75         }
76     }
77     
78     f[1]=1;
79     
80     for(ri i=2;i<=n;i++){
81         if(i%(a[i]*a[i])==0)f[i]=f[i/a[i]]*a[i];
82         else f[i]=f[i/a[i]]*(a[i]-1);
83     }
84 }
posted @ 2017-11-19 21:12  Running-Coder  阅读(144)  评论(0编辑  收藏  举报