一次贪心两次特判
第一次特判最后一步取连续两个最大数
第二次特判 最后一步取 间隔一个数的两个最大数
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> VI;
int q[10010];
VI mul(VI a, int b)
{
VI c;
int t = 0;
for (int i = 0; i < a.size()||t; ++i) {
if (i < a.size()) t += a[i] * b;
c.push_back(t%10);
t /= 10;
}
return c;
}
int main()
{
int n;
scanf("%d", &n);
VI c = {1};
int i;
for (i = 2; i * 2 < n; ++i) {
n -= i;
q[i] = 1;
}
if (n == i || n == i + 1) q[n] = 1;
else { // 第一次特判
int x = i + i + 1 - n;
int t = i + 1;
if (x == 1) x = 2, ++t; // 第二次特判,1不能取
q[x] = 0;
q[t] = q[i] = 1;
}
for (int i = 2; i <= 10000; ++i) {
if (q[i]) {
printf("%d ", i);
c = mul(c, i);
}
}
puts("");
for (int i = c.size() - 1; i >= 0; --i)
printf("%d", c[i]);
return 0;
}