首先答案至少是
Z
/
X
Z/X
Z/X,但是如果此时不互质,那么每次需要挪一个gcd到答案中(就是考虑标准分解式,每次把若干个不互质的质因数部分给b加上)。
这样就是
O
(
m
l
o
g
n
l
o
g
n
)
O(mlognlogn)
O(mlognlogn)的,因为是在其他的地方做到的,m被加到了
1
e
6
1e6
1e6,但还是跑的飞快
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll get_gcd(ll a, ll b) {
if (b == 0)
return a;
return get_gcd(b, a % b);
}
int main() {
ios::sync_with_stdio(0);
int T;
cin >> T;
while (T--) {
ll a, b, c;
cin >> a >> c;
if (c % a) {
cout << "-1" << '\n';
continue;
}
b = c / a;
ll g = get_gcd(a, b);
while (g != 1) {
b *= g;
a /= g;
g = get_gcd(a, b);
}
cout << b << '\n';
}
}