UVa 10791 最小公倍数的最小和(唯一分解定理)
https://vjudge.net/problem/UVA-10791
题意:
输入整数n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小。
思路:
首先对n进行质因数分解,举个例子来说,12=2×2×3,最小和为7,也就是4和3,相同质因子必须放在一起,也就是说这里的2个2必须合在一起变成4,不然2和3会有更小的公倍数6。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 long long n; 10 11 int main() 12 { 13 //freopen("D:\\input.txt", "r", stdin); 14 int kase = 0; 15 while (~scanf("%d", &n) && n) 16 { 17 int temp; 18 int ret = 0; 19 long long ans = 0; 20 int m = sqrt(n + 0.5); 21 for (int i = 2; i <= m && n > 1; i++) 22 { 23 if (n%i == 0) 24 { 25 temp = 1; 26 while (n%i == 0) 27 { 28 temp *= i; 29 n /= i; 30 } 31 ans += temp; 32 ret++; 33 } 34 } 35 if (n > 1) 36 { 37 ans += n; 38 ret++; 39 } 40 while (ret < 2) 41 { 42 ans++; 43 ret++; 44 } 45 printf("Case %d: %lld\n", ++kase, ans); 46 } 47 }