您的位置:首页 > 产品设计 > UI/UE

UOJ 12|【UER #1】猜数|数学

2016-09-19 22:14 706 查看
http://uoj.ac/problem/12

给定完全平方数n,并已知gl=n(g,l∈N),对于a,b(g|gcd(a,b)),求min(a+b),max(a+b)

首先很容易想到均值不等式: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和b是g的倍数,即a,b≥g,故令a=g,b=l时有a+b最大。

强行用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: