计蒜客--T1581--欧拉函数求互质的个数

这里我们定义 \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]);	
	} 
}

猜你喜欢

转载自blog.csdn.net/queque_heiya/article/details/105953399
今日推荐