题意:求至少两个整数的最小公倍数是n,且保证和最小
先把n分解为多项质因子,然后为了保证最小公倍数为n,将相同的质因子合并,再相加即可
特别的,为1时,1*1=2,答案为1+1=2
为素数时,为素数*1=素数,答案为素数+1
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<list>
typedef long long ll;
typedef unsigned long long llu;
const int MAXN = 100 + 10;
const int MAXT = 50000 + 10;
const int INF = 0x7f7f7f7f;
const double pi = acos(-1.0);
const double EPS = 1e-6;
using namespace std;
int primenum;
llu n;
char vis[MAXT];
vector<llu> prime;
void init(){
primenum = 0;
memset(vis, 0, sizeof vis);
vis[0] = vis[1] = 1;
for(llu i = 2; i < MAXT; ++i)
if(vis[i] == 0){
prime.push_back(i);
++primenum;
for(llu j = i * 2; j < MAXT; j += i)
vis[j] = 1;
}
}
int main(){
init();
int lur = 0;
while(scanf("%llu", &n) == 1 && n){
llu tmp = n, ans = 0;
int num = 0;
for(int i = 0; i < primenum; ++i)
if(tmp % prime[i] == 0){
llu k = 1;
++num;
while(tmp % prime[i] == 0){
k *= prime[i];
tmp /= prime[i];
}
ans += k;
}
if(num == 0 || num == 1)
printf("Case %d: %llu\n", ++lur, n + 1);
else printf("Case %d: %llu\n", ++lur, ans);
}
return 0;
}