UVA - 10791 Minimum Sum LCM

来源:互联网 发布:天龙八部3d挂机软件 编辑:程序博客网 时间:2024/05/16 13:39

题意:给出一个n,如果几个数的最小公倍数是n的话,那么sum就是这几个数的和,求最小的sum,根据唯一分解定理,一个数可以唯一的分解为n=p1^a1*p2^a2....,确定最小公倍数是由每个素数的次方的最高决定,所以这是唯一确定的,接下来就是怎么凑成数,使得相加最小,因为a*b>a+b,这个不等式的意思是:如果将两个素因子乘在一个是不如分开好的,所以在程序中,我们只要逐一累加最高次数的那个数就行了,还有一个注意的地方:当N=2147483647时,它是一个素数,此时输出2147483648,但是它超过int范围,应考虑用long long。

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;int main(){    int n,t = 1;    long long sum;    while (scanf("%d",&n) && n){        printf("Case %d: ",t++);        int m = sqrt(n)+2;        int tmp = n,cnt = 0;        sum = 0;        for (int i = 2; i <= m; ++i){            if (tmp % i == 0){                ++cnt;                int cur = 1;                while (tmp % i == 0){                    cur *= i;                    tmp /= i;                }                sum += cur;            }        }        if (tmp == n)            sum = (long long)n + 1;        else if (cnt == 1 || tmp != 1)            sum += tmp;        printf("%lld\n",sum);    }    return 0;}