欧拉函数
定义:正整数n, 1到n-1中与n互质的数的个数为x, 欧拉函数值phi[n]=x。
通式:phi[n]=n(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)[pi为小于等于n的质因数]
如果n为质数,phi[n]=n-1。(因为对于质数n,它的因子只有1和它本身,1和n互质。所以n之前的数都和它互质
x=x/i*(i-1) 等价于 x-=x/i
性质:
1, m和n互质 那么phi[m*n]=phi[m]*phi[n]
2,费马小定理(i为质数)
n为i的倍数时 phi[n*i]=phi[n]*i;
n不为i的倍数时 phi[n*i]=phi[n]*(i-1)
3, 1==n%2时,phi[2*n]=phi[n]
n为奇数
4,设小于n的与n互质的数的总和为S, 那么S=phi[n]*n/2
因为当x和p互质的时候,p-x和p也是互质的
模板
1 const int mx=1e5+10; 2 ll euler(ll n){ 3 ll res=n; 4 for(ll i=2;i*i<=n;i++){ 5 if(0==n%i){//质因子 6 res-=res/i;// 7 while(0==n%i) n/=i;// 8 } 9 } 10 return (n>1)?res-res/n :res; 11 } 12 ll phi[mx]; 13 void euler(){ 14 phi[1]=1; 15 for(ll i=2;i<mx;i++){ 16 if(!phi[i])// 欧拉值没有计算过 不是前面的数的倍数-质数 只筛质数 17 for(ll j=i;j<mx;j+=i){//i的倍数 18 if(!phi[i]) phi[j]=j;//假设前面所有数字都和j互质 19 phi[j]-=phi[j]/i;// 20 } 21 } 22 }