首先假设我们知道了一系列数字a1,a2,a3……an,他们的LCM是n,那么什么时候他们是最优解呢,当他们两两互质的时候
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的和最小,要保证他们两两互质,只要存在不互质的两个数,就一定可以近一步优化
然后保证两两互质的方法就是分解质因子
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int main () {
int n, m, cnt, t = 1;
long long sum;
while (scanf("%d", &n) && n) {
int flagn = n;
sum = cnt = 0;
m = sqrt(n) + 2;
for (int i = 2; i <= m; i++) {
if (flagn % i == 0) {
cnt++;
int temp = 1;
while (flagn % i == 0) {
temp *= i;
flagn /= i;
}
sum += temp;
}
}
if (flagn == n)
sum = (long long)n + 1; //注意n要强制转化为long long
else if (cnt == 1 || flagn != 1)
sum += flagn;
printf("Case %d: %lld\n", t++, sum);
}
return 0;
}