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

 

你可能感兴趣的:(ini)