Cod sursa(job #254743)
#include <stdio.h>
#define MAX_N 35
int n, m, i, j, k;
long long c[MAX_N][MAX_N][MAX_N];
long long fin[MAX_N];
void parc(int n, long long m, int afis) {
long long cop = m;
if (n == 0) return;
for (int i = 0; i < n; i++)
if (c[n][i][n - i - 1] < cop) cop -= c[n][i][n - i - 1];
else {
printf("%d ", afis + i);
if (cop < fin[i]) parc(i, cop, afis);
else parc(i, fin[i], afis);
if (fin[i] != 1) parc(n - i - 1, cop - fin[i], afis + i + 1);
else parc(n - i - 1, cop - fin[i] + 1, afis + i + 1);
break;
}
}
int main() {
freopen("planeta.in", "r", stdin);
freopen("planeta.out", "w", stdout);
scanf("%d %d", &n, &m);
c[1][0][0] = 1;
fin[0] = 1;
fin[1] = 1;
for (i = 2; i <= n; i++)
for (j = 0; j < i; j++) {
c[i][j][i - j - 1] = fin[j] * fin[i - j - 1];
fin[i] += c[i][j][i - j - 1];
}
fin[0] = 0;
parc(n, m, 1);
return 0;
}