UVA10791- Minimum Sum LCM

来源:互联网 发布:js搅拌机型号 编辑:程序博客网 时间:2024/05/01 11:12

首先假设我们知道了一系列数字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
原创粉丝点击