题目链接
题意:给定n个正整数ai,请你求出每个数的欧拉函数。
输入格式
第一行包含整数n。
接下来n行,每行包含一个正整数ai。
输出格式
输出共n行,每行输出一个正整数ai的欧拉函数。
数据范围
1≤n≤100,
1≤ai≤2∗1e9
输入样例:
3
3
6
8
输出样例:
2
2
4
思路:其实欧拉函数就是由容斥原理证明的,简单说就是:
- 1,去掉q1,q2,q3的倍数,
- 2,但有些同时是q1和q2的倍数的数被去掉了两次,所以再加回 p1*p2的倍数
- 3,但对于q1,q2,q3的倍数,被减了三次又被加了三次,所以需要再减去q1q2q3
总结就是:
N - N/q1 - N/q2 - N/q3 -……
+N/q1q2 + N/a1a3 + N/q2q3 +……
-N/q1q2*q3 - ……
……
化简一下就是欧拉方程啦!
代码实现:
#include<iostream>
#include<algorithm>
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){
//res * (1 - 1/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;
}