给定完全平方数
n
,并已知
首先很容易想到均值不等式:
a+b≥2ab−−√=2n−√
,又n是完全平方数,所以
a+b
可以取到最小值。并且可以证明此时的
a,b
满足
g|gcd(a,b)
:
∵∴又∴又故g|gcd(a,b),ab=n对于n的一个质因数分解项pq,显然pqa⋅pqb=pq,即qa+qb=q此时g一定满足qg≤min{qa,qb},才有g|gcd(a,b)max{qa,qb}≥q2,min{qa,qb}≤q2qg≤q2当均值不等式取到等号时有a=b,即qa=qb=q2a和b均是q的倍数
对于最大值,最大化
|a−b|
即有
a+b
最大,因为
a
和
强行用long double+printf出车祸了。。貌似long double+cout就没有问题?
不过这种东西只要稍微改一下形式就好了。
不自行出个大数据还不知道有这种bug。。?
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
ll read() {
ll s = 0, f = 1; char ch = getchar();
for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') f = -1;
for (; '0' <= ch && ch <= '9'; ch = getchar()) s = s * 10 + ch - '0';
return s * f;
}
int main() {
int t = read();
ll g, l;
while (t--) {
g = read(), l = read();
cout<<2 * (ll)(sqrt((long double)g * l))<<' '<<g + l<<endl;
//printf("%lld %lld\n", 2 * (ll)(sqrt((long double)g / l) * l), g + l);
}
return 0;
}