题解: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 @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
历史上的今天:
2023-08-11 P1166题解
点击右上角即可分享
微信分享提示