转载:https://blog.csdn.net/liuzibujian/article/details/81086324
欧拉函数φ(n)是1~n-1的与n互质的数的个数
通式:φ(x) = x * (1 - 1/p1) * (1 - 1/p2) * ......; (pi 为x所有质因子);欧拉函数的几个性质
1.对于质数p,φ(p)=p−1φ(p)=p-1φ(p)=p−1。
2.若p为质数,n=pkn=p^kn=p
k
,则φ(n)φ(n)φ(n)=pkp^kp
k
-pk−1p^{k-1}p
k−1
。
3.欧拉函数是积性函数,但不是完全积性函数。若m,n互质,则φ(m∗n)=φ(m)∗φ(n)φ(m*n)=φ(m)*φ(n)φ(m∗n)=φ(m)∗φ(n)。特殊的,当m=2,n为奇数时,φ(2*n)=φ(n)。
4.当n>2时,φ(n)是偶数。
5.小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
6.n=∑d∣nφ(d)n=sum_{d|n}{φ(d)}n=∑
d∣n
φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n。
埃拉托斯特尼筛求欧拉函数
1 void solve(int n) 2 { 3 4 for(int i = 1; i <= n; i++) p[i] = i; 5 for(int i = 2; i <= n; i++) 6 if(p[i] == i){ 7 for(int j = i; j <= n; j+= i) 8 p[j] = p[j] / i * (i-1); 9 } 10 }
欧拉筛求欧拉函数
1 void euler(int n) 2 { 3 phi[1]=1;//1要特判 4 for (int i=2;i<=n;i++) 5 { 6 if (flag[i]==0)//这代表i是质数 7 { 8 prime[++num]=i; 9 phi[i]=i-1; 10 } 11 for (int j=1;j<=num&&prime[j]*i<=n;j++)//经典的欧拉筛写法 12 { 13 flag[i*prime[j]]=1;//先把这个合数标记掉 14 if (i%prime[j]==0) 15 { 16 phi[i*prime[j]]=phi[i]*prime[j];//若prime[j]是i的质因子,则根据计算公式,i已经包括i*prime[j]的所有质因子 17 break;//经典欧拉筛的核心语句,这样能保证每个数只会被自己最小的因子筛掉一次 18 } 19 else phi[i*prime[j]]=phi[i]*phi[prime[j]];//利用了欧拉函数是个积性函数的性质 20 } 21 } 22 }