Description
Input
Output
Sample Input1
1 1 4
Sample Output1
4 5
Sample Explanation1
Sample Input2
12 8
Sample Output2
8 10
HINT
题解
此题巨坑无比。不要用unsigned/cin。
其次a,b是g的倍数的意思是“对于输入的g,a,b一定要是g的倍数”,而不是“对于所有a,b,输入的g满足a,b是g的倍数”(这种理解其实直接就是g=1,而输入并不保证g=1)。
我们有n=l×g。那么我们分开来讨论:
对于最小值,由均值不等式:a+b≥2√ab=2√n=2√lg(当且仅当a=b取等)。由于a,b≥g,显然可以取等,满足。
对于最大值,由于a+b≥2√lg,我们记f(x)=a+b=n/b+b,显然在(0,√n]是单调递减的。由于b≥g,故在b=g处取最大值。
综上最小值为2√lg,最大值为l+g。
精度问题
有人可能会写:
ans_min = (long long)sqrt((double)g × l);
这样会被卡精度,因为double大概只有15位10进制有效数字。只能得到60分。
解决方法是:
ans_min = (long long)sqrt(l / g) × g;
当然有人可能直接long double保平安了……
1 #include<set> 2 #include<map> 3 #include<ctime> 4 #include<cmath> 5 #include<queue> 6 #include<stack> 7 #include<cstdio> 8 #include<string> 9 #include<vector> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 #define RE register 16 #define IL inline 17 using namespace std; 18 19 LL a,b; 20 int t; 21 22 int main() 23 { 24 cin>>t; 25 while (t--) 26 {scanf("%lld%lld",&a,&b); 27 printf("%lld %lld\n",2*(LL)sqrt(b/a)*a,a+b);} 28 return 0; 29 }
时间: 2024-10-13 20:31:52