欧拉函数

欧拉欧拉欧拉欧拉欧拉欧拉…………

欧拉函数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 }
View Code
原文地址:https://www.cnblogs.com/JSL2018/p/5862864.html