UVA10791 - Minimum Sum LCM(分解质因子)
题目大意:给你一个N,x,y,z..(多个数)的最小公倍数是N,希望这些数的和是最小的,输出这个值(因子数至少是2)。
解题思路:将N质因子分解,这样每个数其实就是每个因子的次数方,这样和一定是最小的,因为不会有可以约掉的数。1的时候要注意一下。还要需要用long long,因为当N =2147483648,它是个素数,但是和确实2147483648 + 1超过int。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
typedef long long ll;
int n;
ll solve () {
int cnt, flag, m;
ll ans = 0LL;
cnt = flag = 0;
m = sqrt(n);
for (int i = 2; i <= m; i++) {
if (n % i == 0) {
cnt = 1;
flag++;
while (n % i == 0) {
cnt *= i;
n /= i;
}
ans += cnt;
}
if (n == 1)
break;
}
if (n != 1 || (flag == 0)) {
ans += n;
flag++;
}
if (flag == 1)
ans++;
return ans;
}
int main () {
int cas = 0;
while (scanf ("%d", &n) && n) {
printf ("Case %d: %lld\n", ++cas, solve());
}
return 0;
}