#include<iostream>
#include<vector>
#include<map>
#include<string>
using UInt = unsigned int;
using ULong = uint64_t;
ULong factorial(UInt n){
return (n<=1)?1:n*factorial(n-1);
}
ULong pow10(UInt x){
return (x==0)?1:10*pow10(x-1);
}
std::map<UInt,UInt> s2m(const std::string& s){
std::map<UInt,UInt> res;
for(auto c : s){
auto d = c-'0';
if(d<1||d>9){
return {};
}else{
++res[d];
}
}
return res;
}
std::string m2s(const std::map<UInt,UInt>& m){
std::string res;
for(auto& [k,v] : m){
res += std::string(v,'0'+k);
}
return res;
}
ULong count(const std::map<UInt,UInt>& digits){
UInt n = 0;
ULong a = 1,b = 1;
for(auto [k,v] : digits){
n += v;
b *= factorial(v);
}
a = factorial(n);
return a/b;
}
ULong func(const std::map<UInt,UInt>& digits,ULong n){
if(digits.empty()){
return 0;
}
ULong place = [&](){
UInt p = 0;
for(auto [digit,num] : digits){
p += num;
}
return pow10(p-1);
}();
ULong sum = 0;
for(auto [digit,num] : digits){
auto nextDigits = digits;
if(num==1){
nextDigits.erase(digit);
}else{
nextDigits[digit] = num-1;
}
auto m = count(nextDigits);
if(sum+m >= n){
auto lower = func(nextDigits,n-sum);
return digit*place + lower;
}else{
sum += m;
}
}
return 0;
}
void test(const std::string& s,const std::vector<ULong>& nList){
std::cout << s << std::endl;
auto m = s2m(s);
for(auto n : nList){
std::cout << n << " -> " << func(m,n) << std::endl;
}
std::cout << std::endl;
}
int main(){
test("123456789",{1,2,3,123456,234567,362880});
test("111222333444",{1,2,3,123456,234567,369600});
test("112233445566778899",{1,2,3,123456,234567,12504636144000});
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxzdHJpbmc+Cgp1c2luZyBVSW50ID0gdW5zaWduZWQgaW50Owp1c2luZyBVTG9uZyA9IHVpbnQ2NF90OwoKVUxvbmcgZmFjdG9yaWFsKFVJbnQgbil7CiAgICByZXR1cm4gKG48PTEpPzE6bipmYWN0b3JpYWwobi0xKTsKfQoKVUxvbmcgcG93MTAoVUludCB4KXsKICAgIHJldHVybiAoeD09MCk/MToxMCpwb3cxMCh4LTEpOwp9CgpzdGQ6Om1hcDxVSW50LFVJbnQ+IHMybShjb25zdCBzdGQ6OnN0cmluZyYgcyl7CiAgICBzdGQ6Om1hcDxVSW50LFVJbnQ+IHJlczsKICAgIGZvcihhdXRvIGMgOiBzKXsKICAgICAgICBhdXRvIGQgPSBjLScwJzsKICAgICAgICBpZihkPDF8fGQ+OSl7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgKytyZXNbZF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKfQoKc3RkOjpzdHJpbmcgbTJzKGNvbnN0IHN0ZDo6bWFwPFVJbnQsVUludD4mIG0pewogICAgc3RkOjpzdHJpbmcgcmVzOwogICAgZm9yKGF1dG8mIFtrLHZdIDogbSl7CiAgICAgICAgcmVzICs9IHN0ZDo6c3RyaW5nKHYsJzAnK2spOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKVUxvbmcgY291bnQoY29uc3Qgc3RkOjptYXA8VUludCxVSW50PiYgZGlnaXRzKXsKICAgIFVJbnQgbiA9IDA7CiAgICBVTG9uZyBhID0gMSxiID0gMTsKICAgIGZvcihhdXRvIFtrLHZdIDogZGlnaXRzKXsKICAgICAgICBuICs9IHY7CiAgICAgICAgYiAqPSBmYWN0b3JpYWwodik7CiAgICB9CiAgICBhID0gZmFjdG9yaWFsKG4pOwogICAgcmV0dXJuIGEvYjsKfQoKVUxvbmcgZnVuYyhjb25zdCBzdGQ6Om1hcDxVSW50LFVJbnQ+JiBkaWdpdHMsVUxvbmcgbil7CiAgICBpZihkaWdpdHMuZW1wdHkoKSl7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgVUxvbmcgcGxhY2UgPSBbJl0oKXsKICAgICAgICBVSW50IHAgPSAwOwogICAgICAgIGZvcihhdXRvIFtkaWdpdCxudW1dIDogZGlnaXRzKXsKICAgICAgICAgICAgcCArPSBudW07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3cxMChwLTEpOwogICAgfSgpOwoKICAgIFVMb25nIHN1bSA9IDA7CiAgICBmb3IoYXV0byBbZGlnaXQsbnVtXSA6IGRpZ2l0cyl7CiAgICAgICAgYXV0byBuZXh0RGlnaXRzID0gZGlnaXRzOwogICAgICAgIAogICAgICAgIGlmKG51bT09MSl7CiAgICAgICAgICAgIG5leHREaWdpdHMuZXJhc2UoZGlnaXQpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBuZXh0RGlnaXRzW2RpZ2l0XSA9IG51bS0xOwogICAgICAgIH0KCiAgICAgICAgYXV0byBtID0gY291bnQobmV4dERpZ2l0cyk7CiAgICAKICAgICAgICBpZihzdW0rbSA+PSBuKXsKICAgICAgICAgICAgYXV0byBsb3dlciA9IGZ1bmMobmV4dERpZ2l0cyxuLXN1bSk7CiAgICAgICAgICAgIHJldHVybiBkaWdpdCpwbGFjZSArIGxvd2VyOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBzdW0gKz0gbTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQgdGVzdChjb25zdCBzdGQ6OnN0cmluZyYgcyxjb25zdCBzdGQ6OnZlY3RvcjxVTG9uZz4mIG5MaXN0KXsKICAgIHN0ZDo6Y291dCA8PCBzIDw8IHN0ZDo6ZW5kbDsKICAgIGF1dG8gbSA9IHMybShzKTsKCiAgICBmb3IoYXV0byBuIDogbkxpc3QpewogICAgICAgIHN0ZDo6Y291dCA8PCBuIDw8ICIgLT4gIiA8PCBmdW5jKG0sbikgPDwgc3RkOjplbmRsOwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oKXsKCiAgICB0ZXN0KCIxMjM0NTY3ODkiLHsxLDIsMywxMjM0NTYsMjM0NTY3LDM2Mjg4MH0pOwogICAgCiAgICB0ZXN0KCIxMTEyMjIzMzM0NDQiLHsxLDIsMywxMjM0NTYsMjM0NTY3LDM2OTYwMH0pOwogICAgCiAgICB0ZXN0KCIxMTIyMzM0NDU1NjY3Nzg4OTkiLHsxLDIsMywxMjM0NTYsMjM0NTY3LDEyNTA0NjM2MTQ0MDAwfSk7CgogICAgcmV0dXJuIDA7Cn0=