思路:
由
可知,当且仅当
时,
的值最小。因为若
,则有:
此时,
,结论即证。
那么,目标就变成了将
分解为若干素数。
由唯一分解定理:
即N可被唯一分解为若干素数的积。
那么答案是否就是
了呢?
由
可知,若将若干个
直接加入集合,那么该集合的
。
那咋办呢?由唯一分解定理,
,其中由于
是素数,所以对于任意的
,有
与
互质。
因此答案为:
一个用于优化的定理:对于正整数
,至多只存在一个
的素因子
,使得
。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
int Case = 0, n;
while (cin >> n && n) {
int Max = ceil(sqrt(n));
long long Ans = 0;
int NumberOfDifferentPrimeFactor = 0;
//枚举素数2到Max
for (int i = 2; i <= Max; ++i) {
if (n % i == 0) {
++NumberOfDifferentPrimeFactor;
int temp = 1;
while (n % i == 0) {
n /= i;
temp *= i;
}
Ans += temp;
}
}
//如果N是素数或1,答案就是1+n
if (NumberOfDifferentPrimeFactor == 0) {
Ans = static_cast<long long>(n) + 1;
}
//N至少被分解为两个素因子且N至多只存在至多一个大于Max的素因子
//因此只处理了一个或n>1就要再处理
else if (NumberOfDifferentPrimeFactor == 1 || n != 1) {
Ans += n;
}
printf("Case %d: %lld\n", ++Case, Ans);
}
return 0;
}