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 }