题解:P10858 [HBCPC2024] Long Live

给你两个数 x,yx,y 让你找到一组 a,ba,b,使 lcm(x,y)gcd(x,y)=ab\sqrt{\frac{\operatorname{lcm}(x,y)}{\gcd(x,y)}}=a\sqrt{b},且 aba\cdot b 最大。

由最小公倍数和最大公约数的性质,我们知道:

lcm(x,y)gcd(x,y)=xy\operatorname{lcm}(x, y) \cdot \gcd(x, y) = x \cdot y

代入原式得:

lcm(x,y)gcd(x,y)=xygcd(x,y)2\sqrt{\frac{\operatorname{lcm}(x, y)}{\gcd(x, y)}} = \sqrt{\frac{x \cdot y}{\gcd(x, y)^2}}

k=xygcd(x,y)2k = \frac{x \cdot y}{\gcd(x, y)^2},则原式变为:

k\sqrt{k}

为了将 k\sqrt{k} 分解为 aba \sqrt{b} 的形式,我们需要找到 kk 的最大整数平方因子 m2m^2(即 mmkk 的因子且 m2m^2 尽可能大)。

所以得出结论:a=1a=1b=lcm(x,y)gcd(x,y)b=\frac{\operatorname{lcm}(x,y)}{\gcd(x,y)}

考时代码:

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int t;
int n,x,a,b;
signed main(){
	cin>>t;
	while(t--){
		cin>>a>>b;
		cout<<'1'<<' '<<(a*b/__gcd(a,b))/__gcd(a,b)<<endl;
	}
	return 0;
}

因为写反了还吃了一发罚时

posted @ 2024-08-11 20:13  KK_SpongeBob  阅读(20)  评论(0)    收藏  举报  来源