func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long INF = (long long)2e18 + 5;   const long long MOD = (long long)1e9 + 7;   const int MAXN = 55;   long long mul(long long x, long long y) {     if (x == 0) return 0;     if (y > INF / x) return INF;     return x * y;   }   long long add(long long x, long long y) { return min(x + y, INF); }   long long n, k, cnt[MAXN], fac[MAXN], dp[MAXN][MAXN], way[MAXN];   vector<int> get_p(long long len, long long k) {     vector<int> res, from(len + 1);     res.push_back(len);     for (int i = 1; i <= len; i++) {       from[i] = i;     }     for (int i = 2; i <= len; i++) {       int src = i;       while (from[src] != src) {         src = from[src];       }       int tgt = k / fac[max(0LL, len - i - 1)];       for (int j = 1; j <= len; j++) {         if (j != src && from[j] == j) {           if (tgt == 0) {             from[j] = i;             res.push_back(j);             break;           } else {             tgt--;           }         }       }       k %= fac[max(0LL, len - i - 1)];     }     return res;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     fac[0] = cnt[0] = cnt[1] = 1;     for (int i = 1; i < MAXN; i++) fac[i] = mul(fac[i - 1], i);     for (int i = 2; i < MAXN; i++) cnt[i] = fac[i - 2];     dp[0][0] = way[0] = 1;     for (int i = 1; i < MAXN; i++) {       for (int j = 1; j <= i; j++) {         for (int k = 1; k <= i; k++) {           dp[i][j] = add(dp[i][j], mul(dp[i - k][j - 1], cnt[k]));         }         way[i] = add(way[i], dp[i][j]);       }     }     int tc;     cin >> tc;     while (tc--) {       cin >> n >> k;       k--;       if (k >= way[n]) {         cout <<  -1 n ;         continue;       }       int put = 0;       vector<int> ans;       while (put < n) {         long long seg, rem = n - put;         for (seg = 1; seg <= rem; seg++) {           long long tot = mul(cnt[seg], way[rem - seg]);           if (k >= tot) {             k -= tot;           } else {             break;           }         }         vector<int> p = get_p(seg, k / way[rem - seg]);         k %= way[rem - seg];         for (int x : p) {           ans.push_back(x + put);         }         put += seg;       }       for (int x : ans) {         cout << x <<    ;       }       cout <<   n ;     }     return 0;   }   