#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <vector>
class f845 {
using bigint = boost::multiprecision::cpp_int;
std::vector<std::vector<bigint> > cc;
bigint count_permutations(int s, int w) {
if (s < 1 || w < 1 || s < w || w * 5 < s) {
return 0;
} else if (s <= 5 && w == 1) {
return 1;
} else if (0 < cc[s][w]) {
return cc[s][w];
} else {
bigint c = 0;
for (int d = 1; d <= 5; d++)
c += count_permutations(s - d, w - 1);
return cc[s][w] = c;
}
}
bigint aux(bigint n, bigint acc, bigint b, int s, int w) {
if (s < 1 || w < 1) {
return acc;
} else if (w == 1) {
return acc * 10 + s;
} else {
for (int d = 1; d <= 5; d++) {
bigint c = count_permutations(s - d, w - 1);
if (n <= b + c)
return aux(n, acc * 10 + d, b, s - d, w - 1);
b += c;
}
return -1;
}
}
public:
f845(int m) : cc(m + 1, std::vector<bigint>(m + 1, 0)) {}
bigint operator()(int m, bigint n) {
bigint b = 0;
if (0 < m && 0 < n) for (int w = 1; w <= m; w++) {
bigint c = count_permutations(m, w);
if (n <= b + c)
return aux(n, 0, b, m, w);
b += c;
}
return 0;
}
};
int main() {
using bigint = boost::multiprecision::cpp_int;
//auto f = f845(2000);
//auto g = [&f](int m, bigint n) {
// std::cout << "(" << m << "," << n << ") → " << f(m, n) << std::endl;
//};
auto g = [](int m, bigint n) {
auto f = f845(m);
std::cout << "(" << m << "," << n << ") → " << f(m, n) << std::endl;
};
/*
g(-1,1);
g(1,-1);
g(-1,-1);
g(2,1);
g(2,2);
g(2,3);
g(20,1);
g(20,2);
g(20,3);
g(20,400096);
g(20,400097);
g(32,1);
g(32,2);
g(32,3);
g(32,1000);
g(32,1000000);
g(32,1000000000);
g(32,1333610936);
g(32,1333610937);
*/
g(2000,(bigint)1 << 1024);
return 0;
}
I2luY2x1ZGUgPGJvb3N0L211bHRpcHJlY2lzaW9uL2NwcF9pbnQuaHBwPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CmNsYXNzIGY4NDUgewogIHVzaW5nIGJpZ2ludCA9IGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX2ludDsKICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxiaWdpbnQ+ID4gY2M7CiAgYmlnaW50IGNvdW50X3Blcm11dGF0aW9ucyhpbnQgcywgaW50IHcpIHsKICAgIGlmIChzIDwgMSB8fCB3IDwgMSB8fCBzIDwgdyB8fCB3ICogNSA8IHMpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgaWYgKHMgPD0gNSAmJiB3ID09IDEpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9IGVsc2UgaWYgKDAgPCBjY1tzXVt3XSkgewogICAgICByZXR1cm4gY2Nbc11bd107CiAgICB9IGVsc2UgewogICAgICBiaWdpbnQgYyA9IDA7CiAgICAgIGZvciAoaW50IGQgPSAxOyBkIDw9IDU7IGQrKykKICAgICAgICBjICs9IGNvdW50X3Blcm11dGF0aW9ucyhzIC0gZCwgdyAtIDEpOwogICAgICByZXR1cm4gY2Nbc11bd10gPSBjOwogICAgfQogIH0KICBiaWdpbnQgYXV4KGJpZ2ludCBuLCBiaWdpbnQgYWNjLCBiaWdpbnQgYiwgaW50IHMsIGludCB3KSB7CiAgICBpZiAocyA8IDEgfHwgdyA8IDEpIHsKICAgICAgcmV0dXJuIGFjYzsKICAgIH0gZWxzZSBpZiAodyA9PSAxKSB7CiAgICAgIHJldHVybiBhY2MgKiAxMCArIHM7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBkID0gMTsgZCA8PSA1OyBkKyspIHsKICAgICAgICBiaWdpbnQgYyA9IGNvdW50X3Blcm11dGF0aW9ucyhzIC0gZCwgdyAtIDEpOwogICAgICAgIGlmIChuIDw9IGIgKyBjKQogICAgICAgICAgcmV0dXJuIGF1eChuLCBhY2MgKiAxMCArIGQsIGIsIHMgLSBkLCB3IC0gMSk7CiAgICAgICAgYiArPSBjOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9CnB1YmxpYzoKICBmODQ1KGludCBtKSA6IGNjKG0gKyAxLCBzdGQ6OnZlY3RvcjxiaWdpbnQ+KG0gKyAxLCAwKSkge30KICBiaWdpbnQgb3BlcmF0b3IoKShpbnQgbSwgYmlnaW50IG4pIHsKICAgIGJpZ2ludCBiID0gMDsKICAgIGlmICgwIDwgbSAmJiAwIDwgbikgZm9yIChpbnQgdyA9IDE7IHcgPD0gbTsgdysrKSB7CiAgICAgIGJpZ2ludCBjID0gY291bnRfcGVybXV0YXRpb25zKG0sIHcpOwogICAgICBpZiAobiA8PSBiICsgYykKICAgICAgICByZXR1cm4gYXV4KG4sIDAsIGIsIG0sIHcpOwogICAgICBiICs9IGM7CiAgICB9CiAgICByZXR1cm4gMDsKICB9Cn07CmludCBtYWluKCkgewogIHVzaW5nIGJpZ2ludCA9IGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX2ludDsKICAvL2F1dG8gZiA9IGY4NDUoMjAwMCk7CiAgLy9hdXRvIGcgPSBbJmZdKGludCBtLCBiaWdpbnQgbikgewogIC8vICBzdGQ6OmNvdXQgPDwgIigiIDw8IG0gPDwgIiwiIDw8IG4gPDwgIikg4oaSICIgPDwgZihtLCBuKSA8PCBzdGQ6OmVuZGw7CiAgLy99OwogIGF1dG8gZyA9IFtdKGludCBtLCBiaWdpbnQgbikgewogICAgYXV0byBmID0gZjg0NShtKTsKICAgIHN0ZDo6Y291dCA8PCAiKCIgPDwgbSA8PCAiLCIgPDwgbiA8PCAiKSDihpIgIiA8PCBmKG0sIG4pIDw8IHN0ZDo6ZW5kbDsKICB9OwogIC8qCiAgZygtMSwxKTsKICBnKDEsLTEpOwogIGcoLTEsLTEpOwogIGcoMiwxKTsKICBnKDIsMik7CiAgZygyLDMpOwogIGcoMjAsMSk7CiAgZygyMCwyKTsKICBnKDIwLDMpOwogIGcoMjAsNDAwMDk2KTsKICBnKDIwLDQwMDA5Nyk7CiAgZygzMiwxKTsKICBnKDMyLDIpOwogIGcoMzIsMyk7CiAgZygzMiwxMDAwKTsKICBnKDMyLDEwMDAwMDApOwogIGcoMzIsMTAwMDAwMDAwMCk7CiAgZygzMiwxMzMzNjEwOTM2KTsKICBnKDMyLDEzMzM2MTA5MzcpOwogICovCiAgZygyMDAwLChiaWdpbnQpMSA8PCAxMDI0KTsKICByZXR1cm4gMDsKfQo=