字典序 最小)(多组数据,0 0结束)
 
#include <cstdio>  
#include <iostream>  
#include <cstring>  
#include <algorithm>  
using  namespace  std; 
int  c[ 25 ] , yh[ 25 ] [ 25 ] , p[ 25 ] , s[ 25 ] , h[ 25 ] , n, t, dg; 
void  dfs ( int  x, int  y) 
{ if  ( x> n&& y== t) { dg= 1 ; return ; } if  ( x> n)  return ; if  ( y>= t)  return ; int  w= 0 , big= 0 , small= 0 ; for  ( register  int  i= 1 ; i<= n; i++ ) if  ( ! p[ i] ) { s[ ++ w] = i; h[ w] = yh[ n] [ x+ w- 1 ] ; } sort ( h+ 1 , h+ 1 + w) ; for  ( register  int  i= 1 , j= w; i<= w; i++ , j-- ) { small+ = s[ i] * h[ j] ; big+ = s[ i] * h[ i] ; } if  ( y+ big< t)  return ; if  ( y+ small> t)  return ; for  ( register  int  i= 1 ; i<= n; i++ ) if  ( ! p[ i] ) { if  ( x> n/ 2 && i<= c[ n- x+ 1 ] )  continue ; c[ x] = i; p[ i] = 1 ; dfs ( x+ 1 , i* yh[ n] [ x] + y) ; p[ i] = 0 ; if  ( dg)  return ; c[ x] = 0 ; } 
} 
int  main ( ) 
{ yh[ 1 ] [ 1 ] = 1 ; for  ( register  int  i= 2 ; i<= 20 ; i++ ) for  ( register  int  j= 1 ; j<= i; j++ ) yh[ i] [ j] = yh[ i- 1 ] [ j- 1 ] + yh[ i- 1 ] [ j] ; scanf ( "%d %d" , & n, & t) ; while ( n|| t) { dg= 0 ; memset ( c, 0 , sizeof ( c) ) ; dfs ( 1 , 0 ) ; for  ( int  i= 1 ; i<= n; i++ ) printf ( "%d " , c[ i] ) ; printf ( "\n" ) ; scanf ( "%d %d" , & n, & t) ; } return  0 ; 
}