假设输入N=p1^a1*p2^p2*....*pn^an,那么能得到它的数中对于质数pi至少有一个数含有因子pi^ai,对质因数pi,pj而言,满足这两个数有两种方法,要么这两个因子在一个数中,要么分别在两个数中。
显然在两个数中比在一个数中更优。因为可以证明当m,n都大于等于2时,m*n>=m+n。
因此最优的方案就是每个pi^ai单独当成一个数相加。
这样就变成了一个分解质因数的题。
这道题卡的有点紧。根号n时间分解质因数时,必须写成i+=2的形式,因为2以上偶数不可能是质数。开根号必须在循环外开,不能在for语句内部开。根据分解完N是不是等于1判断是不是存在一个大质数。
如果n只有一个质因子,结果要加1,因为至少两个数才有LCM。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#include <algorithm>
#define LL long long
int N;
int main(){
int kase=1;
while(~scanf("%d",&N)){
if(!N) break;
LL res=0;
if(N==1){
printf("Case %d: 2\n",kase++);
continue;
}
int k=sqrt(N);
int np=0;
for(int i=2;i<=k;i+=2){
if(N%i==0){
int tmp=1;
while(N%i==0){
N/=i;
tmp*=i;
}
res+=tmp;
np++;
}
if(i==2) i--;
}
if(N>1){
res+=N;
np++;
}
if(np==1) res++;
printf("Case %d: %lld\n",kase++,res);
}
return 0;
}