Cod sursa(job #254179)

Utilizator victorsbVictor Rusu victorsb Data 6 februarie 2009 22:31:10
Problema Planeta Scor Ascuns
Compilator cpp Status done
Runda Marime 0.81 kb
#include <cstdio>

#define Nmax 32
#define LL long long

int N;
LL K;
LL D[Nmax];

void read() {
	scanf("%d%lld", &N, &K);
}

void rez(int F, int P, LL NR) {
	if (P < 1) return;
	int pos;

	for (pos = 1; pos <= P; ++pos)
		if (NR > D[pos - 1] * D[P - pos])
			NR -= D[pos - 1] * D[P - pos];
		else
			break;

	printf("%d ", pos + F);

	LL cat = NR / D[P - pos];
	if (NR % D[P - pos]) ++cat;

	LL rest = NR % D[P - pos];
	if (!rest) rest = D[P - pos];

	rez(F, pos - 1, cat);
	rez(F + pos, P - pos, rest);
}

void solve() {
	D[0] = 1;

	for (int i = 1; i <= N; ++i) {
		for (int j = 1; j <= i; ++j)
			D[i] += D[j - 1] * D[i - j];
	}

	rez(0, N, K);
}

int main() {
	freopen("planeta.in", "r", stdin);
	freopen("planeta.out", "w", stdout);

	read();
	solve();

	return 0;
}