#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <vector>
namespace mp = boost::multiprecision;
class f845 {
private:
std::vector<std::vector<mp::cpp_int> > cc;
mp::cpp_int count_permutations(int s, int w) {
if (s < 1 || w < 1) {
return 0;
} else if (s <= 5 && w == 1) {
return 1;
} else if (0 <= cc[s][w]) {
return cc[s][w];
} else {
mp::cpp_int c = 0;
for (int d = 1; d <= 5; d++)
c += count_permutations(s - d, w - 1);
return cc[s][w] = c;
}
}
std::vector<int> aux(mp::cpp_int n, std::vector<int> acc, mp::cpp_int b, int s, int w) {
if (s < 1 || w < 1) {
return acc;
} else if (w == 1) {
acc.push_back(s);
return acc;
} else {
for (int d = 1; d <= 5; d++) {
mp::cpp_int c = count_permutations(s - d, w - 1);
if (n <= b + c)
return acc.push_back(d), aux(n, acc, b, s - d, w - 1);
b += c;
}
return {{}};
}
}
public:
f845(int m) : cc(m + 1, std::vector<mp::cpp_int>(m + 1, -1)) {}
mp::cpp_int operator()(int m, mp::cpp_int n) {
mp::cpp_int b = 0;
for (int w = 1; w <= m; w++) {
mp::cpp_int c = count_permutations(m, w);
if (n <= b + c) {
mp::cpp_int acc = 0;
for (int d : aux(n, std::vector<int>(), b, m, w))
acc = acc * 10 + d;
return acc;
}
b += c;
}
return 0;
}
};
int main() {
int m = 2000;
mp::cpp_int n = (mp::cpp_int)1 << 1024;
auto f = f845(m);
std::cout << "(" << m << ", " << n << ")\n ↓\n" << f(m, n) << std::endl;
return 0;
}
I2luY2x1ZGUgPGJvb3N0L211bHRpcHJlY2lzaW9uL2NwcF9pbnQuaHBwPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+Cm5hbWVzcGFjZSBtcCA9IGJvb3N0OjptdWx0aXByZWNpc2lvbjsKY2xhc3MgZjg0NSB7CnByaXZhdGU6CiAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bXA6OmNwcF9pbnQ+ID4gY2M7CiAgbXA6OmNwcF9pbnQgY291bnRfcGVybXV0YXRpb25zKGludCBzLCBpbnQgdykgewogICAgaWYgKHMgPCAxIHx8IHcgPCAxKSB7CiAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIGlmIChzIDw9IDUgJiYgdyA9PSAxKSB7CiAgICAgIHJldHVybiAxOwogICAgfSBlbHNlIGlmICgwIDw9IGNjW3NdW3ddKSB7CiAgICAgIHJldHVybiBjY1tzXVt3XTsKICAgIH0gZWxzZSB7CiAgICAgIG1wOjpjcHBfaW50IGMgPSAwOwogICAgICBmb3IgKGludCBkID0gMTsgZCA8PSA1OyBkKyspCiAgICAgICAgYyArPSBjb3VudF9wZXJtdXRhdGlvbnMocyAtIGQsIHcgLSAxKTsKICAgICAgcmV0dXJuIGNjW3NdW3ddID0gYzsKICAgIH0KICB9CiAgc3RkOjp2ZWN0b3I8aW50PiBhdXgobXA6OmNwcF9pbnQgbiwgc3RkOjp2ZWN0b3I8aW50PiBhY2MsIG1wOjpjcHBfaW50IGIsIGludCBzLCBpbnQgdykgewogICAgaWYgKHMgPCAxIHx8IHcgPCAxKSB7CiAgICAgIHJldHVybiBhY2M7CiAgICB9IGVsc2UgaWYgKHcgPT0gMSkgewogICAgICBhY2MucHVzaF9iYWNrKHMpOwogICAgICByZXR1cm4gYWNjOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgZCA9IDE7IGQgPD0gNTsgZCsrKSB7CiAgICAgICAgbXA6OmNwcF9pbnQgYyA9IGNvdW50X3Blcm11dGF0aW9ucyhzIC0gZCwgdyAtIDEpOwogICAgICAgIGlmIChuIDw9IGIgKyBjKQogICAgICAgICAgcmV0dXJuIGFjYy5wdXNoX2JhY2soZCksIGF1eChuLCBhY2MsIGIsIHMgLSBkLCB3IC0gMSk7CiAgICAgICAgYiArPSBjOwogICAgICB9CiAgICAgIHJldHVybiB7e319OwogICAgfQogIH0KcHVibGljOgogIGY4NDUoaW50IG0pIDogY2MobSArIDEsIHN0ZDo6dmVjdG9yPG1wOjpjcHBfaW50PihtICsgMSwgLTEpKSB7fQogIG1wOjpjcHBfaW50IG9wZXJhdG9yKCkoaW50IG0sIG1wOjpjcHBfaW50IG4pIHsKICAgIG1wOjpjcHBfaW50IGIgPSAwOwogICAgZm9yIChpbnQgdyA9IDE7IHcgPD0gbTsgdysrKSB7CiAgICAgIG1wOjpjcHBfaW50IGMgPSBjb3VudF9wZXJtdXRhdGlvbnMobSwgdyk7CiAgICAgIGlmIChuIDw9IGIgKyBjKSB7CiAgICAgICAgbXA6OmNwcF9pbnQgYWNjID0gMDsKICAgICAgICBmb3IgKGludCBkIDogYXV4KG4sIHN0ZDo6dmVjdG9yPGludD4oKSwgYiwgbSwgdykpCiAgICAgICAgICBhY2MgPSBhY2MgKiAxMCArIGQ7CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfQogICAgICBiICs9IGM7CiAgICB9CiAgICByZXR1cm4gMDsKICB9Cn07CmludCBtYWluKCkgewogIGludCBtID0gMjAwMDsKICBtcDo6Y3BwX2ludCBuID0gKG1wOjpjcHBfaW50KTEgPDwgMTAyNDsKICBhdXRvIGYgPSBmODQ1KG0pOwogIHN0ZDo6Y291dCA8PCAiKCIgPDwgbSA8PCAiLCAiIDw8IG4gPDwgIilcbuOAgOKGk1xuIiA8PCBmKG0sIG4pIDw8IHN0ZDo6ZW5kbDsKICByZXR1cm4gMDsKfQo=