前提:欧拉函数Φ(n)表示1~n中与n互质的数的个数。
【若两个数只有1一个共同的质因子,称为互质】
eg:ϕ(6)=2。[1,2,3,4,5,6]
那怎么求1~n中与n互质的数的个数呢?
由算数基本定理可得,任何一个数n可以用如下式子表示,其中Pi是质因数,ai为指数。
这里还要介绍一下容斥原理:
既然要算互质的数的个数,则要将质因数的倍数全部删掉,操作如下:
1)从1~n中减去p1,p2,…,pk的倍数【-奇】
2)加上所有pi*pj的倍数 【+偶】
3)减去所有pi*pj*pk的倍数 【-奇】
如此有:
化简得:
补充步骤解释:
1
2
3
4
5
6
7
第一步:
删掉Pi的倍数
-1
-1
-1
-1
删掉Pj的倍数
-1
-1
-1
-1
删掉pk的倍数
-1
-1
-1
-1
第二步:
加上pi*pj的倍数
+1
+1
加上pi*pk的倍数
+1
+1
加上pj*pk的倍数
+1
+1
第三步:
减去pi*pj*pk的倍数
-1
总共
-1
-1
-1
-1
-1
-1
-1
题目链接:873. 欧拉函数 - AcWing题库
题面:
下面求解质因数的代码可以参考这个博客:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll t,n;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
ll ans=n;
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
ans=ans/i*(i-1);//等价于ans*(1-1/i)
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
cout<<ans<<endl;
}
return 0;
}