12. 【UER #1】猜数
这一天,小Y、小D、小C正在愉快地玩耍。
小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 nn。
小D是个机灵鬼,很快从小Y嘴里套出了 nn 的值。然后在脑内把 nn 写成了 a×ba×b的形式。其中 a,ba,b都是正整数。
小C是个八卦狂,他发现小D从小Y那里获知了神奇的东西,于是死缠烂打追问小D。最后小D说道:“我可以告诉你正整数 gg 和 ll 的值,我保证 ab=gl=nab=gl=n 且 a,ba,b 都是 gg的倍数。但是 a,ba,b 我可不能告诉你。”
这可急坏了小C。他决定退而求其次,找出a+b的最小值和最大值。请你帮帮他吧!
输入格式
第一行一个正整数 TT,表示有 TT 组询问。
接下来 TT 行每行两个正整数 g,lg,l 表示一组询问。
输出格式
对于每个询问输出一行两个正整数,分别表示 a+ba+b 的最小值与最大值。保证问题有解。
C/C++ 输入输出 long long 时请用 %lld。C++ 可以直接使用 cin/cout 输入输出。
样例一
input
1
1 4
output
4 5
explanation
只有三组解:{a=1,b=4},{a=2,b=2},{a=4,b=1}{a=1,b=4},{a=2,b=2},{a=4,b=1}。
样例二
input
1
2 8
output
8 10
分析:
当你真的做出这道题目后,就会发现这是一个纯数学问题。(而我在这道题上浪费了贼多时间o(╥﹏╥)o)
首先看完题目,再加上一个完全平方数的提示,就可能想到,a+b的最小值其实就是用高中的基本不等式来解决的!
a+b≥2根号ab 这个小小的公式就解决了最小值。
但是之后的最大值我做来做去发现我的方法还是不对。后面我不行了,只能百度,-_-||结果发现这是个用我没学过的数学论证直接算出来的……
代码:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long 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;
}
return 0;
}