#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
int T, N, arr[maxn];
long long K, dp[maxn][maxn], first[maxn];
inline long long add(long long a, long long b) {
  return min(0x3f3f3f3f3f3f3f3fLL, a + b);
}
inline long long mul(long long a, long long b) {
  if ((long double)a * b < 0x3f3f3f3f3f3f3f3fLL) return a * b;
  return 0x3f3f3f3f3f3f3f3fLL;
}
inline bool works(vector<int> &v) {
  vector<bool> vis(v.size() + 1, false);
  vector<bool> instack(v.size() + 1, false);
  for (int i = 1; i < v.size(); i++) {
    if (vis[i] || !v[i]) continue;
    int curr = i;
    while (!vis[curr] && curr) {
      vis[curr] = instack[curr] = true;
      curr = v[curr];
    }
    if (instack[curr]) return false;
    for (int k = 0; k < instack.size(); k++) instack[k] = false;
  }
  return true;
}
vector<int> g_arr(int l, int r, long long rem) {
  if (l > r) return {};
  vector<int> res(r - l + 2, 0);
  vector<bool> used(r - l + 2, false);
  int len = r - l + 1;
  res[1] = len;
  used[len] = true;
  for (int i = 2; i < res.size() - 1; i++) {
    for (int k = 1; k <= len; k++) {
      if (used[k]) continue;
      res[i] = k;
      if (!works(res)) {
        res[i] = 0;
        continue;
      }
      long long v = first[max(0, len - i - 1)];
      if (v < rem)
        rem -= v;
      else {
        res[i] = k;
        used[k] = true;
        break;
      }
    }
  }
  for (int i = 1; i <= len; i++)
    if (!used[i]) res.back() = i;
  for (int i = 1; i < res.size(); i++) res[i] += l - 1;
  reverse(res.begin(), res.end());
  res.pop_back();
  reverse(res.begin(), res.end());
  return res;
}
void solve(int l, int r, long long rem) {
  if (l > r) {
    assert(rem == 1);
    return;
  }
  if (l == r) {
    assert(rem == 1);
    return void(arr[l] = l);
  }
  for (int i = l; i <= r; i++) {
    long long curr = first[max(0, i - l - 1)], v = mul(curr, dp[i + 1][r]);
    if (v < rem) {
      rem -= v;
      continue;
    }
    long long lex = (rem + dp[i + 1][r] - 1) / dp[i + 1][r];
    rem -= (lex - 1) * dp[i + 1][r];
    vector<int> nums = g_arr(l, i, lex);
    for (int k = 0; k < nums.size(); k++) arr[l + k] = nums[k];
    solve(i + 1, r, rem);
    return;
  }
  assert(false);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> T;
  while (T--) {
    memset(dp, 0, sizeof dp);
    memset(first, 0, sizeof first);
    memset(arr, 0, sizeof arr);
    cin >> N >> K;
    first[0] = 1;
    for (int i = 1; i <= N; i++) first[i] = mul(first[i - 1], i);
    for (int r = N; r >= 1; r--) {
      dp[r + 1][r] = 1;
      for (int i = r; i >= 1; i--)
        for (int k = i; k <= r; k++)
          dp[i][r] = add(dp[i][r], mul(dp[k + 1][r], first[max(0, k - i - 1)]));
    }
    if (dp[1][N] < K) {
      cout << -1 << '\n';
      continue;
    }
    solve(1, N, K);
    for (int i = 1; i <= N; i++) cout << arr[i] << " ";
    cout << '\n';
  }
}
