UVa 10791 Minimum Sum LCM【唯一分解定理】

题意:给出n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小

看的紫书---

用唯一分解定理,n=(a1)^p1*(a2)^p2---*(ak)^pk,当每一个(ak)^pk作为一个单独的数的时候,和最小

然后就有三种情况

普通的,比如,2*3*3*5,sum=2+9+5=16

只有1个因数的,比如32=2^5,sum=32+1;

没有因数,自己本身是质数,sum=n+1;

因为分解的时候是找到根号n的,比如21,最后还会剩下7,所以sum=sum+n

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 typedef long long LL;
14 const int INF = (1<<30)-1;
15 const int mod=1000000007;
16 const int maxn=100005;
17 
18 int main(){
19     LL n;
20     int kase=0;
21     while(cin>>n&&n){
22         LL m=sqrt(n);
23         LL sum=0;
24         LL ans=n;
25         int cnt=0;
26         for(int i=2;i<=m&&n!=1;i++){
27             if(n%i==0){
28                 cnt++;
29                 LL tmp=1;
30                 while(n%i==0){
31                     tmp*=i;
32                     n=n/i;
33                 }
34                 sum+=tmp;
35             //    cout<<"sum="<<sum<<"\n";
36             //    cout<<"tmp="<<tmp<<"\n";
37             //    cout<<"n="<<n<<"\n";
38                 
39             }
40         }
41         
42         printf("Case %d: ",++kase);
43         
44         if(cnt==0||(cnt==1&&n==1)) cout<<1+ans<<"\n";
45         else if(n!=1) cout<<sum+n<<"\n";
46         else cout<<sum<<"\n";
47     }
48     return 0;
49 }
View Code

 

posted @ 2015-04-23 12:38  sequenceaa  阅读(190)  评论(0编辑  收藏  举报