2015年2月17日 星期二

[CF 513B] Permutations

作法:

如果有先暴力列出 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':' ') ;
}
 

沒有留言:

張貼留言