线性法求欧拉函数

#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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-10-01 16:08  爱努力的人最幸福  阅读(120)  评论(0)    收藏  举报