UVA10791- Minimum Sum LCM

首先假设我们知道了一系列数字a1,a2,a3……an,他们的LCM是n,那么什么时候他们是最优解呢,当他们两两互质的时候

a和b的LCM是n,GCD是m,那么n=a/m*b , 它们的和就是sum=a+b;

如果m不为1(即a和b不互质),那么我们为什么不优化一下,将a变为a=a/m呢?,改变后a和b的LCM依然是n,但是他们的和显然减少了

所以我们得到最重要的一个性质,要想a1,a2,a3……an的和最小,要保证他们两两互质,只要存在不互质的两个数,就一定可以近一步优化

然后保证两两互质的方法就是分解质因子


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int main () {
    int n, m, cnt, t = 1; 
    long long sum;
    while (scanf("%d", &n) && n) {
        int flagn = n;
        sum = cnt = 0;     
        m = sqrt(n) + 2;
        for (int i = 2; i <= m; i++) {
            if (flagn % i == 0) {
                cnt++; 
                int temp = 1; 
                while (flagn % i == 0) {
                    temp *= i; 
                    flagn /= i; 
                }
                sum += temp; 
            } 
        }
        if (flagn == n) 
            sum = (long long)n + 1; //注意n要强制转化为long long 
        else if (cnt == 1 || flagn != 1) 
            sum += flagn; 
        printf("Case %d: %lld\n", t++, sum);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值