唯一分解定理(以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为例)的主要内容,如果未能解决你的问题,请参考以下文章