这里我们定义 \varphi(n)φ(n) 表示所有小于等于 nn 与 nn 互质数的个数。
例如 \varphi(10) = 4φ(10)=4,因为我们可以在 1 \sim 101∼10 中找到 1,3,7,91,3,7,9 与 1010 互质。
输入格式
第一行输入一个整数 tt,表示测试数据组数。
接下来 tt 行,每行有一个整数 nn。
输出格式
对于每组测试数据输出 \varphi(n)φ(n) 。
数据范围
1 \le t \le 100, 1 \le n \le 10^{10}1≤t≤100,1≤n≤1010。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
3
2
10
100
样例输出
1
4
40
思路:1.这里不能够预处理,1e10数量级太大,一维数组无法存储,因此需要及时判断;
2.在O(sqrt(n))的时间内判断计算欧拉值;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxa=1e10+10;
LL euler_deall(LL n){
LL res=n;
for(LL i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
for(;n%i==0;n/=i);
}
}
if(n!=1) res=res/n*(n-1);
return res;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
LL n;
scanf("%lld",&n);
printf("%lld\n",euler_deall(n));
}
}