看题解看半天才看懂,日益变菜.
因为 k<=1e4,直接dfs就行了,然后有一些处理方式
1:p[0]=n可以避免出现负数
2:l,r代表最小和最大的数, r-l+1<=n-1 ,这个式子应该一直成立
3:直接枚举 p[now] - p[now-1] ,这样可以使得字典序一直保持从小到大。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 200;
bool vis[200],flag;
int n,k,p[200];
void dfs(int now,int l,int r){
if(flag)return ;
if(now==n){
k--;
if(!k){
for(int i=0;i<n;i++)
printf("%d%c",p[i]-l+1,i==(n-1)?'\n':' ');
flag=1;
}
return ;
}
for(int i=1-n;i<=n-1;i++)
if(!vis[p[now-1]+i]){
if(flag)return ;
p[now]=p[now-1]+i;
vis[p[now]]=1;
int r1=max(r,p[now]);
int l1=min(l,p[now]);
if(r1-l1<=n-1)
dfs(now+1,l1,r1);
vis[p[now]]=0;
}
}
int main(){
int t;cin>>t;
while(t--){
cin>>n>>k;
flag=0;
p[0]=n;
vis[n]=1;
dfs(1,n,n);
vis[n]=0;
}
return 0;
}