源码:
#include <bits/stdc++.h>
using namespace std;
void pre()
{
#ifndef ONLINE_JUDGE
freopen("lg.in", "r", stdin);
freopen("lg.out", "w", stdout);
#endif
}
int n;
vector<int> vec;
int sigma(int num)
{return ((num * (num + 1)) >> 1) - 1;}
int bs(int l, int r)
{
int ret = 0;
while (l <= r)
{
int mid = (l + r) / 2;
if (sigma(mid) <= n)
ret = mid, l = mid + 1;
else
r = mid - 1;
}
return ret + 1;
}
void print(int val)
{cout << val << ' ';}
class Bigint
{
int len;
int a[10000];
public:
Bigint(int x = 0)
{
memset(a, 0, sizeof(a));
for (len = 1; x; len++)
{
a[len] = x % 10;
x /= 10;
}
len--;
}
int& operator[](const int bid)
{return a[bid];}
void flatten(int l)
{
len = l;
for (int i = 1; i <= len; i++)
{
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
while (!a[len])
len--;
}
Bigint operator*(const int n)
{
Bigint ret;
for (int i = 1; i <= len; i++)
ret[i] = a[i] * n;
ret.flatten(len + 11);
return ret;
}
void print()
{
for (int i = len; i >= 1; i--)
cout << a[i];
}
};
Bigint ans(1);
void solve(int val)
{ans = ans * val;}
int main()
{
pre();
cin >> n;
if (n == 3)
{
cout << 3 << endl << 3;
return 0;
}
int t = sigma(bs(1, n)) - n;
int t2 = bs(1, n);
bool flag = false;
if (t == 1)
t = 2, flag = true;
for (int i = 2; i <= t2; i++)
if (i != t)
vec.push_back(i);
if (flag)
vec[t2 - 2]++;
for_each(vec.begin(), vec.end(), print);
for_each(vec.begin(), vec.end(), solve);
cout << endl;
ans.print();
return 0;
}
pre函数是为了自己用文件调试,请忽略