比赛的时候,推出来一个题的答案是欧拉函数。以前听过了无数遍的。就是不会实现。那么今天就好好学习一下吧。
/* 欧拉函数的条件:小于自然数N并与N互质(除1以外无其他公因子)的自然数。 1、φ(n)=n*(1-1/p1)*(1-1/p2)*........*(1-1/pi) ->容斥原理可证 2、欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n).->公式1可证 3、若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。 4、n=p1^q1*p2^q2*……pn^qn , φ(n)=p1^(q1-1)*p2^(q2-1)……pn^(qn-1)*(p1-1)*(p2-1)*(p3-1)……(pn-1)->公式2、3可证 ,它可以证明很多结论 5、φ(p)=p-1(p是质数) 6、φ(1)=1 7、欧拉函数值为偶数 (n>=2)->公式4或者与(n,m)=1 =》(n,n-m)=1成对存在 8、p、q为两个质数,则φ(p*q)=(p-1)*(q-1);利用3和5 9、3的一个特例k==2,则φ(n)=(p-1)*p 10、可以快速求出欧拉函数的值(a为N的质因数) 若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a; 若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);-》利用1或4 */
欧拉函数值的求解有两种:
看代码:
/* if(n%a==0&&(n/a)%a==0) e(n)=e(n/a)*a; if(n%a==0&&(n/a)%a!=0) e(n)=e(n/a)*(a-1); */ LL Euler1(LL n){ LL ans=n; for(LL i=2;i<=sqrt(n);i++){ if(n%i==0){ while(n%i==0) n=n/i; ans=ans/i*(i-1); } } if(n>1) ans=ans/n*(n-1); return ans; } /* 递推求e(x),欧拉值. */ LL Euler2(LL n){ LL i,j,e[N]; for(i=1;i<=n;i++) e[i] = i; for(i=2;i<=n;i+=2) e[i] /= 2; for(i=3;i<=n;i+=2) if(e[i]==i){ for(j=i;j<=n;j+=i) e[j]=e[j]/i*(i-1); } return e[n]; }