这道题看似简单,其实很坑,如果没注意到n==1时的特殊情况以及n=INT_MAX时的溢出问题的话,就会想我一样WA个不停。。。
分析:注意到当a*b=c时,当a=b时a+b最小,所以对于n,我们可以从sqrt(n)开始逆序枚举到1,便可以得到答案。
PS:这次所有函数都没好好想名字 QAQ
具体实现见代码:
#include<bits/stdc++.h>
#define LL long long ///因为当n=(1<<31)-1时会溢出,所以把所有int换成了LL
using namespace std;
LL gcd(LL a,LL b){return b==0?a:gcd(b,a%b);}
LL LCM(LL n){ /// 这个函数可以将一个数分解为2个数,能得到上面说的min(a+b)
if(n==1) return 1;
for(LL i=sqrt(n);i>0;i--) if(n%i==0&&i/gcd(n/i,i)*n/i==n) return i;
}
LL get_a(LL n){ /// 计算n的Minimun Sum LCM
LL i=LCM(n),a=0;
if(LCM(i)!=1) a+=geta(i); ///如果i还有Minimun Sum LCM
else a+=i; ///不可以分解的数满足 LCM(i)==1;
if(LCM(n/i)!=1) a+=geta(n/i);
else a+=n/i;
return a;
}
int main(){
LL n,cnt=1,a;
//freopen("in.txt","r",stdin);
while(scanf("%lld",&n)&&n) printf("Case %lld: %lld\n",cnt++,geta(n));
return 0;
}