如果有先暴力列出 n 小的時候的所有滿足的排列的話,就可以發現滿足的排列的 1 只會出現在第一個或最後一個,2 只會出現在剩下的連續區間的第一個或最後一個,依此類推。所以總共有 2^(n-1) 個滿足的排列,至於問第幾個排列就一個一個數確定就好了。
code :
#include<bits/stdc++.h> #define LL long long using namespace std; int a[100] ; main() { int n ; LL m ; scanf("%d%I64d",&n,&m) ; int l=1 , r=n ; m-- ; for(int i=n-2;i>=0;i--) { if(m >= (1LL<<i)) a[r--]=n-i-1 , m-=(1LL<<i) ; else a[l++]=n-i-1 ; } a[r]=n ; for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ') ; }
沒有留言:
張貼留言