每次只要打8的暴力即可,前n-8个数可以确定
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define endl '\n'
#define clr(a) memset(a, 0, sizeof(a))
#define lowbit(x) x & -x
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define PB push_back
#define POP pop_back
const double pi = acos(-1);
const int maxn = 6e4 + 101;
const int maxm = 100 + 101;
const ll mod = 998244353;
const int hash_mod = 19260817;
int T, n, k;
int f[9] = {1000000,5040,720,120,24,6,2,1};
int ans[50], vis[45], c[50], cc[50];
struct node{
int e[50];
int g[50];
}d[maxn], dd[maxn];
bool cmp(node a, node b){
for(int i = 1 ; i <= min(n,8) ; ++ i){
if(a.e[i] < b.e[i]) return 1;
if(a.e[i] > b.e[i]) return 0;
}
}
bool mmp(node a, node b){
if(a.g[1] > b.g[1]) return 1;
if(a.g[1] < b.g[1]) return 0;
for(int i = 2 ; i <= min(n,8) ; ++ i){
if(a.e[i] < b.e[i]) return 1;
if(a.e[i] > b.e[i]) return 0;
}
}
int main()
{
scanf("%d", &T);
for(int i = 1 ; i <= 8 ; ++ i) cc[i] = i;
int nt = 0;
do{
nt ++;
for(int j = 2 ; j <= 8 ; ++ j) d[nt].e[j] = cc[j]-cc[j-1];
for(int j = 1 ; j <= 8 ; ++ j) d[nt].g[j] = cc[j];
//cout << endl;
}while(next_permutation(cc+1,cc+1+8));
while(T--){
scanf("%d %d", &n, &k);
clr(vis);
clr(ans);
if(n > 8){
ans[1] = n;
vis[n] = 1;
for(int i = 2 ; i <= n - 8 ; ++ i){
ans[i] = i - 1;
vis[i-1] = 1;
}
for(int i = 1 ; i <= n - 8 ; ++ i) cout << ans[i] << ' ';
for(int i = 1 ; i < 8 ; ++ i) cout << d[k].g[i]+n-9 << ' ';
cout << d[k].g[8]+n-9;
cout << endl;
}
else{
int cnt = 0;
for(int i = 1 ; i <= n ; ++ i) c[i] = i;
do{
cnt ++;
for(int j = 2 ; j <= n ; ++ j) dd[cnt].e[j-1] = c[j]-c[j-1];
d[cnt].e[n] = 0;
for(int j = 1 ; j <= n ; ++ j) dd[cnt].g[j] = c[j];
//cout << endl;
}while(next_permutation(c+1,c+1+n));
//cout << cnt << endl;
sort(dd+1,dd+1+cnt,cmp);
for(int i = 1 ; i < n ; ++ i) cout << dd[k].g[i] << ' ';
cout << dd[k].g[n];
cout << endl;
}
}
return 0;
}