NOI Online 2022 入门组 数学游戏 第二题题解

题意简述:#

z=x×y×gcd(x,y),给出 xz,求出 y。如果无解,输出 1

思路:#

这个 gcd 看着就很烦,我们想办法把它拆掉:
d=gcd(x,y),那么就可以设 x=pd,y=qd
而根据 gcd 的定义,pq 互质,那么 p2q 也互质。

这个时候,z=x×y×gcd(x,y)=pd×qd×d=pqd3
y=qd=pqd3÷pd3=pqd3÷x÷d=zxd

这样只要我们求出 d,就能求出 y

而根据上文推出的 p2q 互质,可以构造出:
d2=gcd(p2d2,qd2)=gcd(x2,zx)

这样,就求出了 d=gcd(x2,zx),进而就求出了 y

不要忘了无解情况!

首先要判断 x 是否是 z 的约数,如果不是的话显然无解。
另外,上文中 d=gcd(x2,zx),有可能会出现开方开不尽的情况。
这种情况要判断,如果 d×dgcd(x2,zx),那么无解。

代码:#

Copy
#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 @   cyhyyds  阅读(144)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示
CONTENTS