874.筛法求欧拉函数
作者:
Qiner
,
2025-01-01 00:02:46
,
所有人可见
,
阅读 3
874.筛法求欧拉函数
phi[1] = 1;
1的欧拉函数是1
- 易知当遍历到 i 时,如 i 不是质数那么i 在被筛掉的时候就求出了
phi[i]
,如果是质数那么phi[i] = i - 1;
,所以不管怎么样,phi[i] 都是已知的
phi[t] = phi[i] * primes[j];
phi[t] = phi[i] * (primes[j] - 1);
- 上面两个转化公式使用欧拉函数公式推出来的
#include <iostream>
using namespace std;
const int NN = 1e6 + 10;
int n, cnt;
int phi[NN], primes[NN], st[NN];
long long ans;
int main(){
cin >> n;
phi[1] = 1; ans ++;
for (int i = 2; i <= n; i ++){
if (!st[i]){
primes[cnt ++] = i;
phi[i] = i - 1;
}
for (int j = 0; primes[j] <= n / i; j ++){
int t = primes[j] * i;
st[t] = 1;
if (i % primes[j] == 0){
phi[t] = phi[i] * primes[j];
break;
}
phi[t] = phi[i] * (primes[j] - 1);
}
ans += phi[i];
}
cout << ans ;
}