洛谷 P8255 [NOI Online 2022 入门组] 数学游戏 题解
题目指路: P8255 [NOI Online 2022 入门组] 数学游戏。
题意大意
给定 \(t\) 组正整数 \((x,z)\),求对于每组 \((x,y)\) 存不存在正整数 \(y\),使得 \(z=x\times y\times\gcd(x,y)\),如果存在,输出最小的正整数 \(y\),否则输出 \(-1\)。
思路分析
首先可以想到,当 \(x\) 不是 \(z\) 的因数的时候,一定不存在 \(y\) 使得 \(z=x\times y\times\gcd(x,y)\) 成立,直接输出 \(-1\)。
接下来,我们来推一下 \(x\times y\times\gcd(x,y)\) 这个式子。
设正整数 \(d = \gcd(x,y)\),有正整数 \(a\) 和 \(b\) 使得 \(x = a \times d\),\(y = b \times d\),且 \(a\) 和 \(b\) 一定互质。
如此可以推出:\(z = x \times y \times \gcd(x,y) = a \times b \times d^3\)。
然后可以推出 \(z \div x = b \times d^2\),由此可以看出,对于每一组指定且符合要求的 \(x\) 和 \(z\),得出的 \(b \times d^2\) 唯一确定,此时的 \(y\) 也唯一确定,这样就保证得到的 \(y\) 一定是最小的。
注意到 \(x^2 = a^2 \times d^2\),如此可得 \(\gcd(z \div x,x^2) = d^2\),然后通过 \(\operatorname{sqrt}\) 函数求得 \(d\)。
注意,这里的 \(\sqrt{d^2}\) 不一定是一个正整数(即不是一个合法的答案),所以我们要判断一下 \(d^2\) 是不是一个完全平方数。设 \(d_1\) 为 \(\sqrt{d^2}\) 向下取整的值,当且仅当 \(d_1^2 = d^2\) 时,\(d\) 为一个完全平方数,此时的 \(d\) 合法。判断 \(d\) 合法之后,可得 \(y = z \div x \div d\),输出即可。
代码
long long t;
long long x, z;
long long d1, d;
int main(){
cin >> t;
for(int i = 1 ; i <= t; i++){
cin >> x >> z;
if(z % x != 0){//首先判断 x 是不是 z 的因数
cout << -1 << endl;
continue;
}
d1 = __gcd(z / x, x * x);
d = sqrt(d1);
if(d * d != d1){//判断
cout << -1 << endl;
continue;
}else{
cout << z / x / d << endl;
}
}
return 0;
}
写在最后
之前大佬们写的很完备了,本蒟蒻就在一些细节方面补充了一下下qwq。
帮到你的话请点赞题解喵,点赞题解谢谢喵。
本文来自 er_mao_jpg ,转载请注明原文链接:https://www.cnblogs.com/er-mao-jpg233/p/18996598, 欢迎各路大佬参观投喂~

浙公网安备 33010602011771号