1. 程式人生 > >UVA - 10791 分解質因數(唯一分解定理)

UVA - 10791 分解質因數(唯一分解定理)

參考https://www.cnblogs.com/scau20110726/archive/2013/01/18/2866101.html

 

題意(就是因為讀錯題意而wa了一次):給一個數字n,範圍在[1,2^23-1],這個n是一系列數字的最小公倍數,這一系列數字的個數至少為2

例如12,是1和12的最小公倍數,是3和4的最小公倍數,是1,2,3,4,6,12的最小公倍數,是12和12的最小公倍數………………

那麼找出一個序列,使他們的和最小,上面的例子中,他們的和分別為13,7,28,24……顯然最小和為7

 

算術基本定理,又稱為正整數的唯一分解定理,即:每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。例如:

 
算術基本定理的內容由兩部分構成:
分解的存在性;
分解的唯一性,即若不考慮排列的順序,正整數分解為素數乘積的方式是唯一的。


既然是唯一的那麼最後的答案就應該是質因子的乘積組成的和

這是用算數基本定理解決組合數問題的https://www.cnblogs.com/rhythmic/p/5846558.html

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define limit(a,b) memset(a,b,sizeof a)
const int N=5e5+7;
const int INF = 0x3f3f3f3f;
const int mod=1e6;
int cnt;
ll Init(ll n){
    int m=sqrt(n);
    ll ans=0;
    for(int i=2;i<=m;i++)//分解質因子
    {
        ll fac=1;
        while(n%i==0&&n>1){
            fac*=i;
            n/=i;
            }
            if(fac!=1)
            ans+=fac;
        if(n==1) break;
    }
    if(n>1)
        return ans+n;
    else
    return ans;
}
int main()
{
    ll n;
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int o=0;
    while(1){
        scanf("%lld",&n);
        if(n==0) break;
        printf("Case %d: ",++o);
        ll cnt=Init(n);
        if(cnt==0||cnt==n) {printf("%lld\n",n+1);continue;}//當cnt==n的時候時說明n是質數,那麼答案就是n+1(本身和1)
        printf("%lld\n",cnt);
    }
     return 0;
}