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

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

猜你喜欢

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