题目
给定 n 个正整数 ai,请你求出每个数的欧拉函数。
欧拉函数的定义
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
若在算数基本定理中,N=pa11pa22…pamm,则:
ϕ(N) = N×p1−1p1×p2−1p2×…×pm−1pm
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
3
6
8
输出样例:
2
2
4
代码
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int n;
cin >> n;
while(n -- ){
int x;
cin >> x;
unordered_map<int,int> primes;
for(int i = 2; i <= x/i; i++){
while(x % i == 0){
x/=i;
primes[i]++;
}
}
if(x > 1) primes[x]++;
// 公式化简之后:f(N) = (p1^(a1-1))*(p1-1) * (p2^(a2-1))*(p2-1) * ... * (pn^(an-1))*(pn-1)
int res = 1;
for(auto prime : primes){
int p = prime.first, a = prime.second - 1;
int t = (p-1);//计算(pi^(ai-1))*(pi-1)
while(a --) t *= p;
res *= t;//累乘结果
}
cout << res << endl;
}
return 0;
}
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int n;
cin >> n;
while(n -- ){
int x;
cin >> x;
unordered_map<int,int> primes;
int res = x;
for(int i = 2; i <= x/i; i++){
while(x % i == 0){
x/=i;
primes[i]++;
}
}
if(x > 1) primes[x]++;
for(auto prime : primes){
res = res / prime.first * (prime.first-1);
}
cout << res << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n --){
int x;
cin >> x;
int res = x;
for(int i = 2; i <= x/i; i++){
if(x % i == 0){
res = res / i * (i-1);
while(x % i == 0) x/=i;//过滤掉当前质因子i,开始下一个质因子的计算
}
}
if(x > 1) res = res / x * (x-1);
cout << res << endl;
}a
return 0;
}