线性法求欧拉函数
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
long long res;
int prime[1000010];//存储质因数
int PII[1000010];//存储欧拉函数
bool stu[1000010];//线性筛法的判断条件
int n,cnt;
long long get_str(int sum){
PII[1]=1;//1的欧拉函数为1
for(int i=2;i<=n;i++){
if(!stu[i])/*是质数*/{
PII[i]=i-1;//质数的欧拉函数是它本身减一
prime[cnt++]=i;//存储质因数
}
//线性筛法
for(int j=0;prime[j]<=sum/i;j++){
stu[prime[j]*i]=true;
if(i%prime[j]==0){
PII[prime[j]*i]=prime[j]*PII[i];
break;
}else
PII[prime[j]*i]=PII[i]*(prime[j]-1);
}
}
for(int i=1;i<=n;i++) res+=PII[i];
return res;
}
int main(){
cin>>n;
cout<<get_str(n)<<endl;
return 0;
}
作者:爱努力的人最幸福
链接:https://www.acwing.com/activity/content/code/content/508441/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号