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;
}
posted @ 2011-06-14 23:22  KOKO's  阅读(417)  评论(0编辑  收藏  举报