线性求欧拉函数
Posted asika3912333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性求欧拉函数相关的知识,希望对你有一定的参考价值。
我们都知道欧拉筛又称线性筛,能在O(n)的时间复杂度内筛出n以内的所有质数,而我们只要在线性筛的代码上改良一下就能求出n以内所有数的欧拉函数了。
筛质数时,设外层在枚举i,内层枚举到prime[j],这时有两种情况:
- i%prime[j]不为0,也就是说,i与j互质,根据欧拉函数的积性可得phi[ i * prime[j] ]=phi[ i ]*phi[ prime[j] ]而这些是前面求出来的,可以直接拿来推。
- i%prime[j]为0,也就是说,i内有一个质因子是prime[j],不过没有关系,这只是在i的质因数分解prime[j]的指数加1,而不会影响 的右边1-1/p的部分,所以我们只要用i * prime[j] 乘上右边部分即可,phi[i]=i * 右边部分,即可推出phi[i * prime[j]]=i * prime[j] * phi[i]/i=prime[j] * phi[i]。
附上代码:
1 int phi[]; 2 int notprime[],prime[]; 3 int cnt; 4 void getphi(int n) 5 notprime[0]=notprime[1]=1; 6 phi[1]=0,phi[2]=1; 7 for(int i=2;i<=n;++i) 8 if(!primenot[i]) 9 phi[i]=i-1;//质数的欧拉函数值为该质数减一 10 prime[++cnt]=i; 11 12 for(int j=1;j<=cnt&&prime[j]*i<=n;++j) 13 notprime[prime[j]*i]=1; 14 if(i%prime[j]) phi[prime[j]*i]=phi[prime[j]]*phi[i];//互质 15 else //不互质 16 phi[prime[j]*i]=prime[j]*phi[i]; 17 break; 18 19 20 21
以上是关于线性求欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章