AcWing 874. 筛法求欧拉函数
原题链接
简单
作者:
minux
,
2020-04-28 23:33:43
,
所有人可见
,
阅读 503
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+5;
int PRIMES[N];
bool vis[N];
int PHI[N];
int n;
// 使用线性筛法计算Euler Function
LL getEulerFunc(){
int cnt=0;
PHI[1]=1; //1的Euler Function进行特殊处理
for(int i=2; i<=n; ++i){
if(!vis[i]) {PRIMES[cnt++]=i; PHI[i]=i-1;}
for(int j=0; PRIMES[j]<=n/i; ++j){
vis[PRIMES[j]*i]=true;
if(i%PRIMES[j]==0){
PHI[PRIMES[j]*i]=PHI[i]*PRIMES[j];
break;
}
else PHI[PRIMES[j]*i]=(PRIMES[j]-1)*PHI[i];
}
}
LL res=0;
for(int i=1; i<=n; ++i) res+=PHI[i];
return res;
}
int main(){
memset(PRIMES, 0X00, sizeof PRIMES);
memset(vis, 0x00, sizeof vis);
memset(PHI, 0x00, sizeof PHI);
cin>>n;
cout<<getEulerFunc()<<endl;
return 0;
}