参考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;
}