题意:
给出n, 求以n为最小公倍数的数集(至少两个数)的最小和
思路:
从1-sqrt开始枚举n的因子,重复除去一个数直到无法整除.重复除去的原因在于,公倍数由可整除的因子得到,自然是需要将因子用完才考虑下一个因子(因为集合里的数要没有公约数)
这样的到的为什么是最小的呢:
4和9的公倍数是36
12和18的公倍数是36
那么4,9是没有公约数的,12,18有公约数,所以很明显的,有公约数的话值会更大
那么结果也是有三种可能的
1.本身是素数,那么1+n最小
2.只有素数的次方得到,那么也是1+n
3.有几个素数乘积得到
代码:
#include<cstdio>
int main() {
long long n, i;
int kase = 1;
while(scanf("%lld", &n) && n) {
printf("Case %d: ", kase++);
long long f = n;
long long sum = 0;
int cnt = 0;
for(i=2; i*i<=f; i++) {
if(n % i == 0) {
cnt ++;
long long k = 1;
while(n % i == 0) {
n /= i;
k *= i;
}
if(k != 1) sum += k;
}
}
if(f == n) sum += n + 1;
if(n != 1 && n != f) sum += n;
if(n==1 && cnt==1) sum++;
printf("%lld\n", sum);
}
return 0;
}