这里我们定义 \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 10^6, 1 \le n \le 10^61≤t≤106,1≤n≤106。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
3
2
10
100
样例输出
1
4
40
思路:1.思路相似与:https://blog.csdn.net/queque_heiya/article/details/105953309
2.O(max_n)时间内筛出欧拉函数值的表 ;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxa=1e6+10;
LL euler[maxa];
void euler_deal(){//O(max_n)时间内筛出欧拉函数值的表
for(int i=0;i<maxa;i++) euler[i]=i;
for(int i=2;i<maxa;i++)
if(euler[i]==i)
for(int j=i;j<maxa;j+=i) euler[j]=euler[j]/i*(i-1);
}
int main(){
int t;
scanf("%d",&t);
euler_deal();
while(t--){
LL n;
scanf("%lld",&n);
printf("%lld\n",euler[n]);
}
}