### 简短思路
#### 问题(1):将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大
1. 对于n <= 4的情况,直接返回特定值。
2. 对于n > 4的情况,使用贪心策略,将n分解为从2开始的连续自然数的和。如果最后剩下一个数,将此剩余数在后项优先的方式下均匀地分给前面各项。
#### 问题(2):将n分解为若干个自然数之和,且使这些自然数的乘积最大
1. 对于n <= 4的情况,直接返回n。
2. ���于n > 4的情况,使用贪心策略,尽可能先将n拆成3,3,3,...,3;若拆成若干3后还有剩余,则为2,或2和2。
### C++代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
long long maxProductUnique(int n) {
if (n <= 4) {
if (n == 4) return 3; // Special case for n = 4
if (n == 3) return 2; // Special case for n = 3
return n;
}
vector<int> parts;
int sum = 0;
for (int i = 2; sum + i <= n; ++i) {
parts.push_back(i);
sum += i;
}
int remaining = n - sum;
for (int i = parts.size() - 1; remaining > 0 && i >= 0; --i) {
parts[i]++;
remaining--;
}
long long product = 1;
for (int part : parts) {
product *= part;
}
return product;
}
long long maxProductNonUnique(int n) {
if (n <= 4) return n;
if (n % 3 == 0) return pow(3, n / 3);
if (n % 3 == 1) return 4 * pow(3, (n - 4) / 3);
return 2 * pow(3, (n - 2) / 3);
}
int main() {
int n;
cin >> n;
cout << maxProductUnique(n) << " " << maxProductNonUnique(n) << endl;
return 0;
}