洛谷 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。

帮到你的话请点赞题解喵,点赞题解谢谢喵。

posted @ 2025-07-21 21:03  牢毛暂时好耶  阅读(41)  评论(0)    收藏  举报