Problem:
已知两个数的最大公因数和最小公倍数,求这个两个数的最小和是多少?
Solution:
已知最大公因数为g,最小公倍数为l,那么两个数可设为x * g和y * g,又因为两个数的乘积==g*l,即x * y == l/g,求最小和即求最小的x+y,问题转换为了:在x和y互质的情况下已知x * y,求x+y的最小值为多少,此时枚举1-sqrt(x * y)的值即可。
note:
注意不要忘记x和y一定要互质,这样才能保证g仍然是最大公因数。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int INF = 0x3fffffff;
int gcd(int a, int b){
a = abs(a); b = abs(b);
while(b != 0){
int t = a%b;
a = b;
b = t;
}
return a;
}
int main() {
int l, g, k, res = INF;
cin >> g >> l;
k = l/g;
for(int x = 1; x <= sqrt(k); x++)
if(k%x == 0 && gcd(x, k/x)==1)
res = min(res, x+k/x);
cout << res*g << endl;
return 0;
}