10791
挺麻烦的一道题,一开始想的由两个最靠中间的互质的数相加就行,WA了几次之后发现题意说的是可由多个数求最小公倍数,
由此转变为了因式分解问题,我开始的思路只能适用于两个数的最小公倍数的情况。
因式分解也得分成几种情况:
1.素数,即没有因子时,直接输出n+1
2.1时输出2
3.n为某一个数的幂时输出n+1
4.由多个数的不同次幂时求每个数的幂后求和
//============================================================================
// Name : 10791.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World inC++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int T, tag, l, num, flag;
long long n, ans, t, in;
int main() {
freopen("a.txt", "r", stdin);
T = 0;
while(scanf("%d", &n)&&n){
T++;
printf("Case %d: ", T);
ans = 0;
if(n == 1){
printf("2\n");
continue;
}
in = n;
l = sqrt(n);
tag = 0;
t = 1;
flag = 0;
for(int i = 2;i <= l;i++){
if(n%i == 0){
n/=i;
while(n%i == 0) n/=i;
if(n == 1){
flag = 1;
}
break;
}
}
if(flag == 1){
printf("%lld\n", in+1);
continue;
}
n = in;
for(int i = 2;i <= sqrt(n);i++){
if(n == 1) break;
if(n%i == 0){
tag = 1;
n /= i;
ans += i;
t *= i;
num = 1;
while(n%i == 0){
n/=i;
num++;
t *= i;
}
if(num > 1){
ans = ans-i+pow(i, num);
}
}
}
if(tag == 0) printf("%lld\n", n+1);
else{
if(t == in){
printf("%lld\n", ans);
}
else printf("%lld\n", ans+in/t);
}
}
return 0;
}

浙公网安备 33010602011771号