给你n个数 1到n 你全排列相邻差序列 有字典序第k大差序列的 输出
数据到1e4 大于 8 的直接暴力 n 后面 1 ~ n-1 的第k-1排列 就是解
然后 1 到 8 打表处理
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 6;
struct node {
int num[10];
char st[10];
bool operator < (const node &a) const {
return strcmp(st, a.st) < 0;
}
} a[10][maxn];
int b[30];
void init() {
for(int k = 2; k <= 8; k ++) {
for(int i = 1; i <= k; i ++) b[i] = i;
int cnt = 1;
do {
for(int i = 1; i <= k; i ++) {
a[k][cnt].num[i] = b[i];
if(i != 1) a[k][cnt].st[i-2] = b[i] - b[i-1] + '*';
}
a[k][cnt].st[k-1] = '\0';
cnt ++;
} while(next_permutation(b + 1, b + k + 1));
sort(a[k] + 1,a[k] + cnt);
}
}
signed main() {
init();
int cas, n, k;
cin >> cas;
while(cas --) {
cin >> n >> k;
if(n > 8) {
b[1] = n;
for(int i = 2; i <= n; i ++) b[i] = i - 1;
while(--k) next_permutation(b + 1, b + 1 + n);
for(int i = 1; i <= n; i ++) {
if(i != 1) cout << " ";
cout << b[i];
}
puts("");
} else {
for(int i = 1; i <= n; i ++) {
if(i != 1) cout << " ";
cout << a[n][k].num[i];
}
puts("");
}
}
return 0;
}