简单搜索~~~
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 20;
int C[MAXN][MAXN];
int path[MAXN], ans[MAXN];
bool visit[MAXN];
int N, M;
bool flag;
void Init()
{
memset(C, 0, sizeof(C));
C[0][0] = 1;
for(int i = 1; i <= 10; ++i)
{
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; ++j)
{
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
}
}
void dfs(int cnt)
{
if(flag) return;
if(cnt == N)
{
int temp = 0;
for(int i = 0; i < N; ++i)
{
//cout << path[i] << " ";
temp += C[N-1][i] * path[i];
}
//cout << " " << temp << endl;
if(temp == M)
{
flag = true;
for(int i = 0; i < N; ++i)
{
ans[i] = path[i];
}
}
return ;
}
for(int i = 1; i <= N; ++i)
{
if(!visit[i])
{
path[cnt++] = i;
visit[i] = true;
dfs(cnt);
cnt--;
visit[i] = false;
}
}
return ;
}
int main()
{
//freopen("aa.in", "r", stdin);
//freopen("bb.out", "w", stdout);
Init();
while(cin >> N >> M)
{
memset(visit, false, sizeof(visit));
flag = false; dfs(0);
cout << ans[0];
for(int i = 1; i < N; ++i)
{
cout << " " << ans[i];
}
cout << endl;
}
return 0;
}