欧拉欧拉欧拉欧拉欧拉欧拉…………
欧拉函数phi(x)表示比x小且与x互质的数,这个东西有时候还是挺有用的,尤其是出现等比例关系的时候
一般求phi直接筛
怎么筛呐
需要先了解一些欧拉函数的性质:
1.如果x是质数,phi(x)=x-1
2.phi(x*y)=phi(x)*phi(y)(也就是说phi是个卷积)
证明:1.使用显然法证明:显然 2.我太弱不会,有兴趣的同学可以自行查找相关资料(逃
然后就可以愉快的递推求解了
跟莫比乌斯函数miu很相似,在求phi的时候要顺便把质数给筛出来
然后大概流程就是枚举i,如果i是质数,加入质数表,phi(i)=i-1,否则枚举质数知道质数*i>要求的范围,其中先把i*质数标记不是质数,phi(i*质数)=phi(i)*phi(质数)
这里如果i%质数==0,phi(i*质数)=phi(i)*质数,而且需要brak,证明有点玄,我也只能勉强意会,有兴趣的同学们可以自行推到(逃
这里需要注意,i%质数==0的时候phi(i*质数)=phi(i)*质数,因为phi的积性只有在i和质数互质的时候才成立,至于为什么这里要*质数,请同学们自行推到(逃
代码:
1 void shai(){ 2 memset(kang,0,sizeof(kang)); 3 phi[1]=1; 4 for(int i=2;i<=n;i++){ 5 if(!kang[i]){ phi[i]=i-1; zhi[++ztop]=i;} 6 for(int j=1;j<=ztop && i*zhi[j]<=n;j++){ 7 kang[i*zhi[j]]=true; 8 if(i%zhi[j]==0){ phi[i*zhi[j]]=phi[i]*zhi[j]; break;} 9 phi[i*zhi[j]]=phi[i]*phi[zhi[j]]; 10 } 11 } 12 }