UVA - 10791 - Minimum Sum LCM(唯一分解定理)

题意:求至少两个整数的最小公倍数是n,且保证和最小

先把n分解为多项质因子,然后为了保证最小公倍数为n,将相同的质因子合并,再相加即可

特别的,为1时,1*1=2,答案为1+1=2

为素数时,为素数*1=素数,答案为素数+1

 

 1 #include<cstdio>  
 2 #include<cstring>  
 3 #include<cctype>  
 4 #include<cstdlib>  
 5 #include<cmath>  
 6 #include<iostream>  
 7 #include<sstream>  
 8 #include<iterator>  
 9 #include<algorithm>  
10 #include<string>  
11 #include<vector>  
12 #include<set>  
13 #include<map>  
14 #include<deque>  
15 #include<queue>  
16 #include<stack>  
17 #include<list>  
18 typedef long long ll;  
19 typedef unsigned long long llu;  
20 const int MAXN = 100 + 10;  
21 const int MAXT = 50000 + 10;  
22 const int INF = 0x7f7f7f7f;  
23 const double pi = acos(-1.0);  
24 const double EPS = 1e-6;  
25 using namespace std;  
26   
27 int primenum;  
28 llu n;  
29 char vis[MAXT];  
30 vector<llu> prime;  
31   
32 void init(){  
33     primenum = 0;  
34     memset(vis, 0, sizeof vis);  
35     vis[0] = vis[1] = 1;  
36     for(llu i = 2; i < MAXT; ++i)  
37         if(vis[i] == 0){  
38             prime.push_back(i);  
39             ++primenum;  
40             for(llu j = i * 2; j < MAXT; j += i)  
41                 vis[j] = 1;  
42         }  
43 }  
44   
45 int main(){  
46     init();  
47     int lur = 0;  
48     while(scanf("%llu", &n) == 1 && n){  
49         llu tmp = n, ans = 0;  
50         int num = 0;  
51         for(int i = 0; i < primenum; ++i)  
52             if(tmp % prime[i] == 0){  
53                 llu k = 1;  
54                 ++num;  
55                 while(tmp % prime[i] == 0){  
56                     k *= prime[i];  
57                     tmp /= prime[i];  
58                 }  
59                 ans += k;  
60             }  
61         if(num == 0 || num == 1)  
62             printf("Case %d: %llu\n", ++lur, n + 1);  
63         else  printf("Case %d: %llu\n", ++lur, ans);  
64     }  
65     return 0;  
66 }  

 

posted @ 2016-10-25 10:38  TianTengtt  阅读(142)  评论(0)    收藏  举报