筛法求欧拉函数
对几个关键式子的理解我都标上了注释,只是我的个人理解,如果哪里理解的不对,还望大佬指出, 感谢!
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
int p[N], cnt;//存质数
int phi[N];//存欧拉函数
bool st[N];//判定是否为质数
LL get_eulers(int n)
{
phi[1] = 1;
for(int i = 2; i <= n; i ++ )
{
if(!st[i])
{
p[cnt ++ ] = i;//存最小质因子
phi[i] = i - 1;//质数p的欧拉函数
}
for(int j = 0; p[j] <= n / i ; j ++ )
{
st[p[j] * i] = true;//i的倍数记为非质数
if(i % p[j] == 0)
{
phi[p[j] * i] = phi[i] * p[j];//p[j]是i的质因子
break;//p[j] 一定是i的最小质因子
}
else phi[p[j] * i] = phi[i] * (p[j] - 1);//p[j]不是i的质因子
}
}
LL res = 0;
for(int i = 1; i <= n; i++ ) res += phi[i];
return res;
}
int main()
{
int n;
cin >> n;
cout << get_eulers(n) << endl;
return 0;
}