Codeforces 1295D
题意:
gcd(a,m) == gcd(a+x,m) 0 <= x < m;
思路:
设 a = sg, m = tg;
gcd(a,m) ==gcd(sg+x,tg) == g
所以令 x = k*g
所以 gcd(s+k,t) == 1;
因为 a <= a+x < a+m;
(0,a] 和 (m,m+a) 与 m 互质 个数相同;
则本题可化简为 gcd(k,t)==1 k<t, 的个数
#include<bits/stdc++.h>
using namespace std;
#define re register
typedef long long LL;
const int N = 1e5+10;
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
LL euler(LL n)
{
LL ret = 1;
for(re LL i=2;i*i<=n;i++)
{
if( n % i == 0 )
{
n /= i;
ret *= i-1;
while( n % i == 0 )
{
n /= i;
ret *= i;
}
}
}
if( n > 1 )
ret *= n-1;
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL a,m;
scanf("%lld%lld",&a,&m);
printf("%lld\n",euler(m/gcd(a,m)));
}
return 0;
}