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; }