#include <iostream>
#include <vector>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using BigInt = boost::multiprecision::cpp_int;
string nthPartition(int m, BigInt n)
{
vector<vector<BigInt>> A(m, vector<BigInt>(m, 0));
fill_n(A[0].begin(), min(m, 5), 1);
for (int i = 1; i < m; i++) {
int j = 0;
while (++j < m) A[i][j] = A[i][j - 1] + A[i - 1][j - 1];
while (--j > 5) A[i][j] -= A[i][j - 5];
}
int L;
for (L = 1; L <= m; L++) {
if (n <= A[L - 1][m - 1]) break;
if (L < m) {
n -= A[L - 1][m - 1];
} else {
return "0";
}
}
string a(L, '0');
for (int i = 0; i < L; i++) {
int j;
for (j = 1; j <= 5; j++) {
if (i < L - 1) {
if (n <= A[L - i - 2][m - j - 1]) break;
n -= A[L - i - 2][m - j - 1];
} else {
if (j == m) break;
}
}
a[i] += j;
m -= j;
}
return a;
}
int main(void)
{
int m = 2000;
BigInt n = (BigInt)1 << 1024;
cout << "(" << m << ", " << n << ")\n ↓\n" << nthPartition(m, n) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vY3BwX2ludC5ocHA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBCaWdJbnQgPSBib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9pbnQ7CgpzdHJpbmcgbnRoUGFydGl0aW9uKGludCBtLCBCaWdJbnQgbikKewogICAgdmVjdG9yPHZlY3RvcjxCaWdJbnQ+PiBBKG0sIHZlY3RvcjxCaWdJbnQ+KG0sIDApKTsKICAgIGZpbGxfbihBWzBdLmJlZ2luKCksIG1pbihtLCA1KSwgMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG07IGkrKykgewogICAgICAgIGludCBqID0gMDsKICAgICAgICB3aGlsZSAoKytqIDwgbSkgQVtpXVtqXSA9IEFbaV1baiAtIDFdICsgQVtpIC0gMV1baiAtIDFdOwogICAgICAgIHdoaWxlICgtLWogPiA1KSBBW2ldW2pdIC09IEFbaV1baiAtIDVdOwogICAgfQoKICAgIGludCBMOwogICAgZm9yIChMID0gMTsgTCA8PSBtOyBMKyspIHsKICAgICAgICBpZiAobiA8PSBBW0wgLSAxXVttIC0gMV0pIGJyZWFrOwogICAgICAgIGlmIChMIDwgbSkgewogICAgICAgICAgICBuIC09IEFbTCAtIDFdW20gLSAxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIjAiOwogICAgICAgIH0KICAgIH0KCiAgICBzdHJpbmcgYShMLCAnMCcpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMOyBpKyspIHsKICAgICAgICBpbnQgajsKICAgICAgICBmb3IgKGogPSAxOyBqIDw9IDU7IGorKykgewogICAgICAgICAgICBpZiAoaSA8IEwgLSAxKSB7CiAgICAgICAgICAgICAgICBpZiAobiA8PSBBW0wgLSBpIC0gMl1bbSAtIGogLSAxXSkgYnJlYWs7CiAgICAgICAgICAgICAgICBuIC09IEFbTCAtIGkgLSAyXVttIC0gaiAtIDFdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGogPT0gbSkgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFbaV0gKz0gajsKICAgICAgICBtIC09IGo7CiAgICB9CgogICAgcmV0dXJuIGE7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIGludCBtID0gMjAwMDsKICAgIEJpZ0ludCBuID0gKEJpZ0ludCkxIDw8IDEwMjQ7CiAgICBjb3V0IDw8ICIoIiA8PCBtIDw8ICIsICIgPDwgbiA8PCAiKVxu44CA4oaTXG4iIDw8IG50aFBhcnRpdGlvbihtLCBuKSA8PCBlbmRsOwogICAgcmV0dXJuIDA7Cn0=