#include <iostream>
#include <vector>
using namespace std;
string nthPartition(int m, int n)
{
vector<vector<int>> A(m, vector<int>(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 Q[][2] = {
{2, 1}, {2, 2}, {2, 3},
{20, 1}, {20, 2}, {20, 3}, {20, 400096}, {20, 400097},
{32, 1}, {32, 2}, {32, 3}, {32, 1000}, {32, 1000000}, {32, 1000000000}, {32, 1333610936}, {32, 1333610937}
};
int main(void)
{
for (auto [m, n] : Q) cout << "(" << m << ", " << n << ") → " << nthPartition(m, n) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cmluZyBudGhQYXJ0aXRpb24oaW50IG0sIGludCBuKQp7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IEEobSwgdmVjdG9yPGludD4obSwgMCkpOwogICAgZmlsbF9uKEFbMF0uYmVnaW4oKSwgbWluKG0sIDUpLCAxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgaW50IGogPSAwOwogICAgICAgIHdoaWxlICgrK2ogPCBtKSBBW2ldW2pdID0gQVtpXVtqIC0gMV0gKyBBW2kgLSAxXVtqIC0gMV07CiAgICAgICAgd2hpbGUgKC0taiA+IDUpIEFbaV1bal0gLT0gQVtpXVtqIC0gNV07CiAgICB9CgogICAgaW50IEw7CiAgICBmb3IgKEwgPSAxOyBMIDw9IG07IEwrKykgewogICAgICAgIGlmIChuIDw9IEFbTCAtIDFdW20gLSAxXSkgYnJlYWs7CiAgICAgICAgaWYgKEwgPCBtKSB7CiAgICAgICAgICAgIG4gLT0gQVtMIC0gMV1bbSAtIDFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiMCI7CiAgICAgICAgfQogICAgfQoKICAgIHN0cmluZyBhKEwsICcwJyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IEw7IGkrKykgewogICAgICAgIGludCBqOwogICAgICAgIGZvciAoaiA9IDE7IGogPD0gNTsgaisrKSB7CiAgICAgICAgICAgIGlmIChpIDwgTCAtIDEpIHsKICAgICAgICAgICAgICAgIGlmIChuIDw9IEFbTCAtIGkgLSAyXVttIC0gaiAtIDFdKSBicmVhazsKICAgICAgICAgICAgICAgIG4gLT0gQVtMIC0gaSAtIDJdW20gLSBqIC0gMV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaiA9PSBtKSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYVtpXSArPSBqOwogICAgICAgIG0gLT0gajsKICAgIH0KCiAgICByZXR1cm4gYTsKfQoKaW50IFFbXVsyXSA9IHsKICAgIHsyLCAxfSwgezIsIDJ9LCB7MiwgM30sCiAgICB7MjAsIDF9LCB7MjAsIDJ9LCB7MjAsIDN9LCB7MjAsIDQwMDA5Nn0sIHsyMCwgNDAwMDk3fSwKICAgIHszMiwgMX0sIHszMiwgMn0sIHszMiwgM30sIHszMiwgMTAwMH0sIHszMiwgMTAwMDAwMH0sIHszMiwgMTAwMDAwMDAwMH0sIHszMiwgMTMzMzYxMDkzNn0sIHszMiwgMTMzMzYxMDkzN30KfTsKCmludCBtYWluKHZvaWQpCnsKICAgIGZvciAoYXV0byBbbSwgbl0gOiBRKSBjb3V0IDw8ICIoIiA8PCBtIDw8ICIsICIgPDwgbiA8PCAiKSDihpIgIiA8PCBudGhQYXJ0aXRpb24obSwgbikgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9