a和b的LCM是n,GCD是m,那么n=a/m*b , 它们的和就是sum=a+b;
如果m不为1(即a和b不互质),那么我们为什么不优化一下,将a变为a=a/m呢?,改变后a和b的LCM依然是n,但是他们的和显然减少了
所以我们得到最重要的一个性质,要想a1,a2,a3……an的和最小,要保证他们两两互质,只要存在不互质的两个数,就一定可以近一步优化
那我们怎么保证两两互质呢?方法其实很简单,直接分解质因子
例如264600=8*27*25*49 , 只是由3个2,3个3,2个5,2个7,处理后得到的因子,那么8,27,25,49的LCM是264600,并且两两互质,他们还要不要处理呢?不需要了,直接将他们加起来就是我们要的答案!
所以
1.没有质因数的数 :1单独处理,就等于2;
2.有质因子的数:
a.只有一个质因数——质数、质数n:最后加1
b.有两个及以上个质数:累加每项质因数ak
#include <bits/stdc++.h>
using namespace std;
long long n,cas=0;
long long addDivisor(){
long long ans=0;
int cnt=0;
for(int i=2;i<=n/i;i++){
if(n%i==0){
long long sum=1;
cnt++;
while(n%i==0){
sum*=i;
n/=i;
}
ans+=sum;
}
}
if(n>1) ans+=n,cnt++;//一个数最多有一个质因子
if(cnt<=1) ans++;//每个数都要有两个因数,质因数不够,1来凑
return ans;
}
int main(int argc, char** argv) {
while(cin>>n,n){
if(n==1) printf("Case %lld: 2\n",++cas);
else printf("Case %lld: %lld\n",++cas,addDivisor());
}
return 0;
} 
京公网安备 11010502036488号