【模板】欧拉函数 & 欧拉筛

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 5e4 + 10;
 5 
 6 int n;
 7 
 8 int vis[maxn];//最小质因子 
 9 int prime[maxn];
10 int fun[maxn];//欧拉函数
11 int sum[maxn];//欧拉函数的和 
12 
13 void cal_sum()
14 {
15     sum[1] = 1;
16     for(int i = 1 ; i <= n ; i++){
17         sum[i] = sum[i - 1] + fun[i];
18     }
19 }
20 
21 void pre_solve()
22 {
23     fun[1] = 1;
24     int cnt = 0;
25     
26     for(int i = 2 ; i < maxn ; i++){
27         if(!vis[i]){
28             vis[i] = i;//i是素数,自身为最小素因子 
29             prime[cnt++] = i;//记录素数
30             fun[i] = i - 1;//素数i的欧拉函数值为i-1 //1.
31         }
32         for(int j = 0 ; j < cnt ; j++){
33             if(prime[j] * i > maxn)    break;
34             
35             vis[i * prime[j]] = prime[j];//扩展求最小素因子 
36             
37             if(i % prime[j] == 0){
38                 fun[i * prime[j]] = fun[i] * prime[j];//2.
39                 break;
40             }
41             
42             fun[i * prime[j]] = fun[i] * fun[prime[j]];//3.互素 
43         }
44     }
45     
46     cal_sum();
47 }
48 
49 int main(){
50     scanf("%d",&n);
51     pre_solve();
52     
53     if(n == 1){
54         printf("0\n");
55     }else{
56         printf("%d\n",2 * sum[n - 1] + 1);
57     }
58 
59     return 0;
60 }

 

参考文献:https://blog.csdn.net/weixin_43914593/article/details/104229700

FROM :ECUST 罗勇军老师

posted @ 2020-09-21 22:04  LegendN  阅读(135)  评论(0编辑  收藏  举报