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;
}
posted @ 2022-03-31 15:35  cyhyyds  阅读(131)  评论(3编辑  收藏  举报