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
");
55 }else{
56 printf("%d
",2 * sum[n - 1] + 1);
57 }
58
59 return 0;
60 }
参考文献:https://blog.csdn.net/weixin_43914593/article/details/104229700
FROM :ECUST 罗勇军老师