题目大意

题意

题意

分析

$ t = gcd(a,m) $

t=gcd(a+x,m)gcd((a+x)/t,m/t)=1t = gcd(a+x,m) \Longrightarrow gcd((a+x)/t,m/t) = 1

x[0,m)x ∈ [0,m)

m=m/t,k=(a+x)/tk[(a+t1)/t,(m+a1)/t]m = m/t , k = (a+x)/t , k∈[(a+t-1)/t,(m+a-1)/t]

则问题转化为求区间 kkmm 互质的个数

区间互质问题可以考虑容斥原理

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
namespace RC{
typedef long long LL;
int T, N, num;
LL A, B;
int a[100];
void prime(int n) {
num = 0;
for (int i = 2; i*i <= n; i++) {
if ((n%i) == 0) {
num++;
a[num] = i;
while ((n%i) == 0) {
n /= i;
}
}
}
if (n > 1) {
num++;
a[num] = n;
}
return;
}
// 容斥原理 求 1-r 不被n的质因子整除的个数
LL solve(LL r, int n) {
prime(n);
LL res = 0;
for (int i = 1; i < (1 << num); i++) {
int kk = 0;
LL div = 1;
for (int j = 1; j <= num; j++) {
if (i&(1 << (j - 1))) {
kk++;
div *= a[j];
}
}
if (kk % 2)
res += r / div;
else
res -= r / div;
}
return r - res;

}

LL que(LL L, LL R, LL k) {
return solve(R, k) - solve(L - 1, k);
}
}

int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
void solve(){
int a,m;cin>>a>>m;
int t = gcd(a,m);
int l = (a+t-1)/t;
int r = (m+a-1)/t;
m = m/t;
cout << RC::que(l,r,m) << endl;
}

signed main()
{
int t;cin>>t;
while(t--) solve();
return 0;
}