题目:
欧拉函数:如何求1~N中与N互质的所有数(容斥原理)
1.从1~N中去掉p1,p2,······pk的所有倍数:N-N/p1-N/p2-···N/pk(一个数可能被去掉两次)
2.一个数(既是i的倍数又是j的倍数)可能被去掉两次,所以加上所有pi*pj的倍数:N-N/p1-N/p2-···N/pk+N/(p1*p2)+N/(p1p3)+···
3.减去所以pi*pj*pk的倍数:N-N/p1-N/p2-···N/pk+N/(p1*p2)+N/(p1p3)+···-N/(p1*p2*p3)-N/(p1*p2*p4)-····
代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--){
int a;
cin>>a;
int res=a;
for (int i = 2; i <= a / i; i ++ ) //分解质因数
if (a % i == 0) //i是质因子时
{
res = res / i * (i - 1);
while (a % i == 0) a /= i;
}
if (a > 1) res = res / a * (a - 1);
cout<<res<<endl;
}
return 0;
}