因为题目就要求最后一万个,暴力8!的全排列,按差值排序,给的数超过8,就取第k小然后8个数字每个都加上倒数第九个数字,不到8就直接暴力排序吧。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <algorithm>
typedef long long ll;
using namespace std;
const ll mod=998244353;
const int maxn=1e5+100;
int len;
struct node
{
char s[15];
}w[maxn],Q[maxn];
bool cmp(node a,node b)
{
for(int i=1;i<=len;i++){
if(a.s[i]-a.s[i-1]!=b.s[i]-b.s[i-1])
return a.s[i]-a.s[i-1]<b.s[i]-b.s[i-1];
}
}
void permutation(char x[])
{
strcpy(w[0].s,x);
for(int i=1;i<=10000;i++){
next_permutation(x,x+9);
strcpy(w[i].s,x);
}
}
int main() {
char p[15];
for(int i=0;i<=8;i++)p[i]='0'+i;
permutation(p);
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d%d",&n,&k);
if(n<=8){
char pp[15];
len=n-1;
for(int i=0;i<n;i++)pp[i]=i+1+'0';
int cnt=2;
int lim=1;
for(int i=1;i<=n;i++)lim*=i;
strcpy(Q[1].s,pp);
while(cnt<=lim){
next_permutation(pp,pp+n);
strcpy(Q[cnt].s,pp);
cnt++;
}
sort(Q+1,Q+cnt,cmp);
for(int i=0;i<n-1;i++)printf("%c ",Q[k].s[i]);
printf("%c\n",Q[k].s[n-1]);
}
else{
cout<<n<<" ";
for(int i=1;i<=n-9;i++)printf("%d ",i);
for(int i=1;i<8;i++)printf("%d ",(int)w[k-1].s[i]-'0'+n-9);
printf("%d\n",(int)w[k-1].s[8]-'0'+n-9);
}
}
return 0;
}