#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
int n;
long long int k;
int p[50];
long long int fact[51];
long long int add(long long int x, long long int y) {
  if (x > LLONG_MAX - y) return LLONG_MAX;
  return x + y;
}
long long int mul(long long int x, long long int y) {
  if (x > LLONG_MAX / y) return LLONG_MAX;
  return x * y;
}
long long int memo[51];
long long int dp(int n) {
  long long int& ans = memo[n];
  if (ans != -1) return ans;
  if (n == 0) return ans = 1;
  ans = 0;
  for (int s = 1; s < n + 1; ++s) {
    ans = add(ans, mul(s - 2 >= 0 ? fact[s - 2] : 1LL, dp(n - s)));
  }
  return ans;
}
bool valid(int i, int x, int s) {
  static vector<bool> vis;
  assert(p[i] == -1);
  vis.assign(n, 0);
  vis[i] = true;
  p[i] = x;
  int u = i;
  int count = 0;
  while (p[u] != -1) {
    count++;
    u = p[u] - 1;
    if (vis[u]) {
      p[i] = -1;
      return (u == i and count == s);
    }
    vis[u] = true;
  }
  p[i] = -1;
  assert(count < s);
  return true;
}
void fill_block(int offset, int s, long long int k) {
  assert((s - 2 >= 0 ? fact[s - 2] : 1) > k);
  p[offset] = s + offset;
  vector<bool> used(s, 0);
  used[s - 1] = true;
  for (int i = 1; i < s; ++i) {
    for (int j = 0; j < s; ++j) {
      if (not used[j] and valid(offset + i, offset + j + 1, s)) {
        assert(i != j);
        long long int w = s - i - 2 >= 0 ? fact[s - i - 2] : 1;
        if (w > k) {
          p[offset + i] = offset + j + 1;
          used[j] = true;
          break;
        } else {
          k -= w;
        }
      }
    }
  }
}
bool search(int i, long long int k) {
  if (i == n) return true;
  for (int s = 1; s < n - i + 1; ++s) {
    long long int ways = mul((s >= 2 ? fact[s - 2] : 1LL), dp(n - i - s));
    if (ways < k)
      k -= ways;
    else {
      long long int w = dp(n - i - s);
      assert(k >= 1);
      fill_block(i, s, (k - 1) / w);
      k -= mul((k - 1) / w, w);
      return search(i + s, k);
    }
  }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  cin >> t;
  memset(memo, -1, sizeof memo);
  fact[0] = 1;
  for (int i = 1; i < 51; ++i) fact[i] = mul(fact[i - 1], i);
  while (t--) {
    cin >> n >> k;
    memset(p, -1, sizeof p);
    if (search(0, k)) {
      for (int i = 0; i < n; ++i) {
        if (i) cout << ' ';
        cout << p[i];
      }
      cout << '\n';
    } else {
      cout << "-1\n";
    }
  }
  return 0;
}
