您的位置:首页 > 其它

UVA - 10791 Minimum Sum LCM

2013-10-16 00:32 351 查看
题意:给出一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: