目录
显示
本题真正的难点不是在结论上(确信
题目链接
题解
为方便起见,不妨设 \(a \leq b\)。
众所周知有个好东西叫均值不等式。
$$\frac{a+b}{2} \geq \sqrt{ab}$$
这个不等式取到等号当且仅当 \(a=b\)。
于是 \(a+b\) 的最小值当然是 \(2 \sqrt{gl}\)。
\(a+b\) 的最大值呢?因为 \(g \leq a \leq \sqrt{gl}\),显然可知当 \(a=g,b=l\) 时取到最大值 \(g+l\)。
当然本题的难点其实不在上面(
如果直接计算 \(\sqrt{gl}\),当 \(g,l \leq 10^{18}\) 精度无法承受。
我们可以这样计算:
- 令 \(p=\gcd(g,l)\),\(x=g/p\),\(y=l/p\)。
- 这时候可以证明 \(x,y\) 均为完全平方数(原因?可以用反证法,这里略去)。
- 因此 \(\sqrt{gl}=p \sqrt{x} \sqrt{y}\)。
#include <cmath>
#include <iostream>
using namespace std;
long long gcd(long long x,long long y)
{
return y==0?x:gcd(y,x%y);
}
long long calc(long long x,long long y)
{
long long p=gcd(x,y);
x/=p,y/=p;
return p*(long long)sqrt(x)*(long long)sqrt(y);
}
int main()
{
int t;
cin>>t;
while(t--)
{
long long g,l;
cin>>g>>l;
cout<<2*calc(g,l)<<' '<<g+l<<endl;
}
return 0;
}