UVA - 10791 分解質因數(唯一分解定理)
阿新 • • 發佈:2018-11-20
參考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; }