NOI Online 2022 入门组 数学游戏 第二题题解
题意简述:
令 \(z=x×y×\text{gcd}(x,y)\),给出 \(x\) 和 \(z\),求出 \(y\)。如果无解,输出 \(-1\)。
思路:
这个 \(\text{gcd}\) 看着就很烦,我们想办法把它拆掉:
设 \(d=\text{gcd}(x,y)\),那么就可以设 \(x=pd, y=qd\)。
而根据 \(\text{gcd}\) 的定义,\(p\) 和 \(q\) 互质,那么 \(p^2\) 和 \(q\) 也互质。
这个时候,\(z=x×y×\text{gcd}(x,y)=pd×qd×d=pqd^3\),
而 \(y=qd=pqd^3÷pd^3=pqd^3÷x÷d= \frac{z}{xd}\)。
这样只要我们求出 \(d\),就能求出 \(y\)。
而根据上文推出的 \(p^2\) 和 \(q\) 互质,可以构造出:
\(d^2=\text{gcd}(p^2 d^2,qd^2)=\text{gcd}(x^2,\frac{z}{x})\)。
这样,就求出了 \(d=\sqrt {\text{gcd}(x^2,\frac{z}{x})}\),进而就求出了 \(y\)。
不要忘了无解情况!
首先要判断 \(x\) 是否是 \(z\) 的约数,如果不是的话显然无解。
另外,上文中 \(d=\sqrt {\text{gcd}(x^2,\frac{z}{x})}\),有可能会出现开方开不尽的情况。
这种情况要判断,如果 \(d×d≠\text{gcd}(x^2,\frac{z}{x})\),那么无解。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main () {
int T;
cin >> T;
while (T --) {
ll x, z;
cin >> x >> z;
ll d = sqrt (__gcd (x * x, z / x));//设d
ll y = z / x / d;//解出y
if (z % x || d * d != __gcd (x * x, z / x)) {//判断是否无解
puts ("-1");
}
else {
cout << y << endl;//输出答案
}
}
return 0;
}