P2568 GCD(线性筛-欧拉函数模板)
有两个容易出错的地方:
1.欧拉函数定义为从1到n的质数,但“质数”不一定是质数。事实上,只有当gcd(a,b)=1时才能计算。因此,我们不能放弃A=1,B=1的情况。
2.第一次做的时候觉得应该避免i=j的情况,但问题是简化公式本身已经考虑到了i=j的情况,并以此作为进一步计算的基础。
其他想法:做练习。即使不是,我也不得不承认。不要去想你的‘AC’,哪怕很牛逼,体验1。(这可以让你在打铁的时候‘开心’)
#includecstdio
#包括牡蛎
# includecstring
#定义ll长
使用命名空间标准;
const int MAXN=2e7
int primes[MAXN],CNT=0;
bool is prime[MAXN];
ll phi[MAXN],SumPhi[MAXN];
void init(int n){ 0
memset(isPrime,1,sizeof(isPrime));
[1]=1;
isPrime[1]=0,phi[2]=1;
for(int I=2;I=n;I){ 0
if(isPrime[i])素数[ cnt]=i,phi[I]=I-1;
for(int j=1;j=cntprimes[j]* I=n;j ){
is prime[I * primes[j]]=0;
If(i%primes[j]==0){//可整除。
[I *素数[j]]=素数[j]*[I];
打破;
} else phi[I *素数[j]]=phi[I]* phi[素数[j]];
}
}
for(int I=1;I=n;(一)
sumPhI[I]=sumPhI[I-1]PhI[I];
返回;
}
int main(){ 0
int n;
scanf('%d ',n);
init(n);
ll ans=0;
for(ll I=1;i=cntI){ 0
int p=素数[I];//枚举质数
ans=(2 * sumPhi[n/p-1]);//错误公式
ans=2 * sumPhi[n/p]-1;//正确的公式
}
printf('%lld\n ',ans);
返回0;
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/139161.html