唯一分解定理(以Minimun Sum LCM UVa 10791为例)

Posted sapphirebitter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唯一分解定理(以Minimun Sum LCM UVa 10791为例)相关的知识,希望对你有一定的参考价值。

唯一分解定理是指任何正整数都可以分解为一些素数的幂之积,即任意正整数n=a1^p1*a2^p2*...*ai^pi;其中ai为任意素数,pi为任意整数。

题意是输入整数n,求至少2个整数,使得它们的最小公倍数为n,且这些整数的和最小,输出最小的和。由唯一分解定理可看出当每个ai^pi作为一个单独的整数时最优,只要注意你=1时的答案为2,n的因子只有一种时需要加个1以及n=2^31-1不要溢出即可写出程序。需注意的是应从2开始寻找质因子,因为2是最小的素数,由于习惯从1开始循环则是错误的。

代码如下:

#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;

int divide(int& n, int d) {
  int x = 1;
  while(n % d == 0) { n /= d; x *= d; }
  return x;///找出单一质因子的对应幂积
}

int main(){
    int n,kase=0;
    while(~scanf("%d",&n)&&n){
        if(n==1) {printf("Case %d: %d\n",++kase,2);continue;}
        int m = floor(sqrt(n) + 0.5);///floor为取整函数
        long long ans=0;
        int cnt=0;
        for(int i=2;i<=m;i++){///只需要查找是否n能整除2到其的平方根即可判断其是否是素数,因为在判断是否能被小的数整除时就对应判断了其对应的较大的数
            if(n%i==0){
                cnt++;
                ans+=divide(n,i);
            }
        }
        if(n > 1) { cnt++; ans += n; }
        if(cnt <= 1) ans++;
        printf("Case %d: %lld\n",++kase,ans);
    }
    return 0;
}

 

以上是关于唯一分解定理(以Minimun Sum LCM UVa 10791为例)的主要内容,如果未能解决你的问题,请参考以下文章

hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)

唯一分解定理

数论初步——欧几里得算法和唯一分解定理

UVA - 11388 唯一分解定理

UVA294DIvisors(唯一分解定理+约数个数)

Aladdin and the Flying Carpet(唯一分解定理)