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