noi 已知gcd和lcm求最小和?

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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值