func_code_string: #include <bits/stdc++.h>   using namespace std;   class trio {    public:     long long first, second, third;   };   long long gcdExtended(long long a, long long b, long long *x, long long *y) {     if (a == 0) {       *x = 0, *y = 1;       return b;     }     long long x1, y1;     long long gcd = gcdExtended(b % a, a, &x1, &y1);     *x = y1 - (b / a) * x1;     *y = x1;     return gcd;   }   long long modInverse(long long a, long long m) {     long long x, y;     long long g = gcdExtended(a, m, &x, &y);     long long res = (x % m + m) % m;     return res;   }   long long power(long long x, long long y) {     long long ans = 1, second = x;     while (y) {       if (y & 1) {         ans *= second;         ans %= 1000000007;       }       second *= second;       second %= 1000000007;       y >>= 1;     }     return ans;   }   const long long N = 51;   long long dp1[N];   long long dp3[N];   int32_t main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     ;     __int128 val = 1;     dp1[0] = 1;     dp1[1] = 1;     dp1[2] = 1;     for (long long i = 3; i < N; ++i) {       val *= (i - 2);       val = min(val, (__int128)1000000000000000001);       dp1[i] = val;     }     dp3[0] = 1;     dp3[1] = 1;     for (long long i = 2; i < N; ++i) {       val = 0;       for (long long j = 1; j < i + 1; ++j) {         val += (__int128)dp3[i - j] * dp1[j];         val = min(val, (__int128)1000000000000000001);       }       dp3[i] = val;     }     long long third;     cin >> third;     while (third--) {       long long n, k;       cin >> n >> k;       long long arr[N] = {0};       if (dp3[n] < k) {         cout << -1 <<   n ;         continue;       }       for (long long i = 1; i <= n;) {         long long len, left, st;         __int128 count;         for (long long j = i; j <= n; ++j) {           len = j - i + 1;           left = n - i - len + 1;           st = j;           count = (__int128)dp1[len] * dp3[left];           count = min(count, (__int128)1000000000000000001);           if (count < k) {             k -= (count);           } else {             break;           }         }         arr[i] = st;         set<long long> available;         for (long long j = i; j < i + len; ++j) {           available.insert(j);         }         available.erase(st);         for (long long j = i + 1; j < i + len; ++j) {           if (j == i + len - 1) {             arr[j] = *(available.begin());             break;           }           for (auto it : available) {             long long cur = it;             while (cur != j && cur) {               cur = arr[cur];             }             if (cur == j) continue;             count = (__int128)dp1[len - (j - i)] * dp3[left];             count = min(count, (__int128)1000000000000000001);             if (count < k) {               k -= (count);             } else {               arr[j] = it;               break;             }           }           available.erase(arr[j]);         }         i += len;       }       for (long long i = 1; i < n + 1; ++i) {         cout << arr[i] <<    ;       }       cout <<   n ;     }     return 0;   }   