// https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1691038333/845
#include<iostream>
#include<vector>
#include<map>
#include<string>
using UInt = unsigned int;
using ULong = uint64_t;
std::string search(UInt m,UInt n,UInt d,const std::vector<UInt>& digits,const std::vector<std::vector<ULong>>& mat){
if(m==0&&n==1&&d==0){
return "";
}
auto sum = 0;
for(auto digit : digits){
if(digit > m) continue;
auto tmp = mat[m-digit][d-1];
if(sum+tmp>=n){
return std::to_string(digit)+search(m-digit,n-sum,d-1,digits,mat);
}else{
sum+=tmp;
}
}
return "0";
}
std::string func(UInt m,UInt n,const std::vector<UInt>& digits){
const auto matSize = std::max<std::size_t>(m,digits.size())+1;
std::vector<std::vector<ULong>> mat(matSize, std::vector<ULong>(matSize,0));
for(auto digit : digits){
if(digit<matSize){
mat[digit][1] = 1;
}
}
mat[0][0] = 1;
for(std::size_t i=1; i<matSize; ++i){
for(std::size_t j=1; j<matSize; ++j){
for(auto digit : digits){
if((i+digit)<matSize && (j+1)<matSize){
mat[i+digit][j+1] += mat[i][j];
}
}
}
}
UInt d;
ULong sum = 0;
for(d=1; d<matSize; ++d){
if(sum+mat[m][d]>=n){
break;
}else{
sum+=mat[m][d];
}
}
if(d == matSize){
return "0";
}
return search(m,n-sum,d,digits,mat);
}
void test(UInt m,UInt n){
std::cout << '(' << m << ',' << n << ") -> " << func(m,n,{1,2,3,4,5}) << std::endl;
}
int main(){
test(2,1);
test(2,2);
test(2,3);
test(20,1);
test(20,2);
test(20,3);
test(20,400096);
test(20,400097);
test(32,1);
test(32,2);
test(32,3);
test(32,1000);
test(32,1000'000);
test(32,1000'000'000);
test(32,1333'610'936);
test(32,1333'610'937);
return 0;
}
Ly8gaHR0cHM6Ly9tLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5oLm5ldC90ZXN0L3JlYWQuY2dpL3RlY2gvMTY5MTAzODMzMy84NDUKCiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8c3RyaW5nPgoKdXNpbmcgVUludCA9IHVuc2lnbmVkIGludDsKdXNpbmcgVUxvbmcgPSB1aW50NjRfdDsKCnN0ZDo6c3RyaW5nIHNlYXJjaChVSW50IG0sVUludCBuLFVJbnQgZCxjb25zdCBzdGQ6OnZlY3RvcjxVSW50PiYgZGlnaXRzLGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFVMb25nPj4mIG1hdCl7CiAgICAKICAgIGlmKG09PTAmJm49PTEmJmQ9PTApewogICAgICAgIHJldHVybiAiIjsKICAgIH0KCiAgICBhdXRvIHN1bSA9IDA7CiAgICBmb3IoYXV0byBkaWdpdCA6IGRpZ2l0cyl7CiAgICAgICAgaWYoZGlnaXQgPiBtKSBjb250aW51ZTsKCiAgICAgICAgYXV0byB0bXAgPSBtYXRbbS1kaWdpdF1bZC0xXTsKCiAgICAgICAgaWYoc3VtK3RtcD49bil7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhkaWdpdCkrc2VhcmNoKG0tZGlnaXQsbi1zdW0sZC0xLGRpZ2l0cyxtYXQpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBzdW0rPXRtcDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICIwIjsKfQoKc3RkOjpzdHJpbmcgZnVuYyhVSW50IG0sVUludCBuLGNvbnN0IHN0ZDo6dmVjdG9yPFVJbnQ+JiBkaWdpdHMpewogICAgY29uc3QgYXV0byBtYXRTaXplID0gc3RkOjptYXg8c3RkOjpzaXplX3Q+KG0sZGlnaXRzLnNpemUoKSkrMTsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFVMb25nPj4gbWF0KG1hdFNpemUsIHN0ZDo6dmVjdG9yPFVMb25nPihtYXRTaXplLDApKTsKCiAgICBmb3IoYXV0byBkaWdpdCA6IGRpZ2l0cyl7CiAgICAgICAgaWYoZGlnaXQ8bWF0U2l6ZSl7CiAgICAgICAgICAgIG1hdFtkaWdpdF1bMV0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBtYXRbMF1bMF0gPSAxOwoKICAgIGZvcihzdGQ6OnNpemVfdCBpPTE7IGk8bWF0U2l6ZTsgKytpKXsKICAgICAgICBmb3Ioc3RkOjpzaXplX3Qgaj0xOyBqPG1hdFNpemU7ICsrail7CiAgICAgICAgICAgIGZvcihhdXRvIGRpZ2l0IDogZGlnaXRzKXsKICAgICAgICAgICAgICAgIGlmKChpK2RpZ2l0KTxtYXRTaXplICYmIChqKzEpPG1hdFNpemUpewogICAgICAgICAgICAgICAgICAgIG1hdFtpK2RpZ2l0XVtqKzFdICs9IG1hdFtpXVtqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBVSW50IGQ7CiAgICBVTG9uZyBzdW0gPSAwOwogICAgZm9yKGQ9MTsgZDxtYXRTaXplOyArK2QpewogICAgICAgIGlmKHN1bSttYXRbbV1bZF0+PW4pewogICAgICAgICAgICBicmVhazsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc3VtKz1tYXRbbV1bZF07CiAgICAgICAgfQogICAgfQoKICAgIGlmKGQgPT0gbWF0U2l6ZSl7CiAgICAgICAgcmV0dXJuICIwIjsKICAgIH0KCiAgICByZXR1cm4gc2VhcmNoKG0sbi1zdW0sZCxkaWdpdHMsbWF0KTsKfQoKdm9pZCB0ZXN0KFVJbnQgbSxVSW50IG4pewogICAgc3RkOjpjb3V0IDw8ICcoJyA8PCBtIDw8ICcsJyA8PCBuIDw8ICIpIC0+ICIgPDwgZnVuYyhtLG4sezEsMiwzLDQsNX0pIDw8IHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oKXsKICAgIHRlc3QoMiwxKTsKICAgIHRlc3QoMiwyKTsKICAgIHRlc3QoMiwzKTsKICAgIHRlc3QoMjAsMSk7CiAgICB0ZXN0KDIwLDIpOwogICAgdGVzdCgyMCwzKTsKICAgIHRlc3QoMjAsNDAwMDk2KTsKICAgIHRlc3QoMjAsNDAwMDk3KTsKICAgIHRlc3QoMzIsMSk7CiAgICB0ZXN0KDMyLDIpOwogICAgdGVzdCgzMiwzKTsKICAgIHRlc3QoMzIsMTAwMCk7CiAgICB0ZXN0KDMyLDEwMDAnMDAwKTsKICAgIHRlc3QoMzIsMTAwMCcwMDAnMDAwKTsKICAgIHRlc3QoMzIsMTMzMyc2MTAnOTM2KTsKICAgIHRlc3QoMzIsMTMzMyc2MTAnOTM3KTsKICAgIHJldHVybiAwOwp9