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 }

浙公网安备 33010602011771号