比赛的时候,推出来一个题的答案是欧拉函数。以前听过了无数遍的。就是不会实现。那么今天就好好学习一下吧。
/*
欧拉函数的条件:小于自然数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];
}