欧拉函数:
在数论中,对正整数n,欧拉函数是1~n中与n互质的数的个数,记作φ(n) 。
公式:
例如:n=6=23
则φ(n) =n(1-1/2)*(1-1/3)=2
证明:
利用容氏原理进行证明
- 从1~n中去掉p1,p2,…,pk的所有倍数,即:r1=n-n/p1-n/p2-…-n/pk
- 由于多去除了部分公共倍数,因此要加上加上所有pipj的倍数,即:r2=r1+n/(p1p2)+n/(p1p3)+…+n/(pk-1pk)
- 减去所有pipjpk的倍数,即r3=r2-n/(p1p2p3)-n/(p1p3)-…-n/(pk-2pk-1*pk)
- 以此类推,最终结果和欧拉展开项φ(n)相同
代码:
给n个正整数ai,求出每个数的欧拉函数。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5;
int p[N];
int main()
{
int n;
long long m;
cin>>n;
while(n--){
cin>>m;
memset(p,0,sizeof p);
int res = m;
int cnt = 0;
for(int i = 2;i<=m/i;i++)
{
if(m%i==0){
p[cnt++] = i;
while(m%i==0) m/=i;
}
}
if(m>1)res = res/m*(m-1);
for(int i = 0;i<cnt;i++)res = res/p[i]*(p[i]-1);
cout<<res<<endl;
}
return 0;
}