题目链接:https://codeforces.com/contest/1295/problem/D
题目大意:
多样例
给你一个a和m。问有多少个x(0<=x<m) 使得gcd(a, m)=gcd(a+x, m)。
思路:根据扩欧定理:
gcd(a+x, m)= gcd((a+x)%m, m)
(a+x)%m的取值可能是[0, m-1]。
gcd(a+x, m)= gcd(a, m)
1:如果gcd(a, m)=1。那么就是求gcd(X, m)=1 (0<=X<m) X=0不满足。就是m的欧拉函数。
2:如果GCD=gcd(a, m)!=1。那么就是求gcd(X/GCD, m/GCD)=1 (0/GCD<=X/GCD<m/GCD) X=0/GCD不满足。就是m/GCD 的欧拉函数。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL euler(LL n)
{
LL res=n;
for(LL i=2;i*i<=n;i++)
{
if(n%i==0)//第一次找到的必为素因子
res=res/i*(i-1);
while(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 a, m;
scanf("%lld%lld", &a, &m);
if(__gcd(a,m)==1){
printf("%lld\n", euler(m));
}
else{
printf("%lld\n", euler(m/__gcd(a, m)));
}
}
return 0;
}
H_ang
发布了384 篇原创文章 · 获赞 22 · 访问量 2万+
私信
关注