欧拉函数

Posted cdcq(本博客废弃!现用博客:https://www.cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉函数相关的知识,希望对你有一定的参考价值。

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

欧拉函数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

 

以上是关于欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章

欧拉Euler函数

HDU 2588 GCD(欧拉函数)

蓝桥杯必备算法一:欧拉函数

数论之旅4---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)

欧拉函数性质与求法 [数论][欧拉函数]

欧拉筛欧拉函数