我们可以先用唯一分解定理将这个数字分解成素因子幂的乘积,为了得到最小的和,我们可以发现:每个 素因子的幂单独分开的和是最小的。
先说明每个素因子都是以出现的最大的次数出现。因为最小公倍数一定,因此至少有一个数字的这个素因子的幂等于最大的次数,如果不一次取完,另一个和其他的因子的乘积肯定没有1和其他因子的乘积小。
再说明每个素因子都是分开的:每个素因子的幂都是大于2的,都分开的话相当于每个素因子的幂都乘1,而不分开的话对于那两个素因子都乘了一个不小于2 的数字,因此分开更小。
剩下的素数也要加入到答案里面。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>
#include<cmath>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
bool check[MAXN];
int prime[MAXN];
ll cnt[MAXN];
int tot;
ll n;void creat_prime()
{tot=0;for(int i=2;i<MAXN;i++){if(!check[i]) prime[tot++]=i;for(int j=0;j<tot && prime[j]*i<MAXN ;j++){check[prime[j]*i]=true;if(i%prime[j]==0) break;}}
}int main()
{creat_prime();int t;int Case=0;while(~scanf("%lld",&n) && n){Case++; t=0;ll ans=0;printf("Case %d:",Case);if(n==1){printf(" %d\n",2);continue;}for(int i=0;i<tot;i++){cnt[i]=1;while(n%prime[i]==0){cnt[i]*=prime[i];n/=prime[i];}if(cnt[i]>1){ans+=cnt[i];t++;}if(n==1)break;}if(n>1){ans+=n; t++;}if(t==1) ans++;printf(" %lld\n",ans);}
}