Cod sursa(job #252661)

Utilizator wefgefAndrei Grigorean wefgef Data 4 februarie 2009 19:54:49
Problema Planeta Scor Ascuns
Compilator cpp Status done
Runda Marime 0.95 kb
#include <cstdio>

const char FILEIN[] = "planeta.in";
const char FILEOUT[] = "planeta.out";
const int MAX_N = 40;

int n;
long long k;
long long d[MAX_N];
int sol[MAX_N];

void dinamica() {
	d[0] = 1;
	for (int i = 1; i <= n; ++i)
		for (int j = 0; j < i; ++j)
			d[i] += d[j] * d[i-1 - j];
}

void reconst(int st, int dr, long long fact, int start) {
	if (st > dr) return;

	if (st == dr) {
		sol[st] = start;
		return;
	}

	long long sum = 0;
	int i;
	for (i = 1; i <= dr-st+1; ++i) {
		if (sum + d[i-1] * d[dr-st+1 - i] * fact >= k)
			break;
		sum += d[i-1] * d[dr-st+1 - i] * fact;
	}
	k -= sum;
	
	sol[st] = i + start-1;
	reconst(st + 1, st + i - 1, fact * d[dr - st + 1 - i], start);
	reconst(st + i, dr, fact, start + i);
}

int main() {
	freopen(FILEIN, "r", stdin);
	freopen(FILEOUT, "w", stdout);

	scanf("%d %lld", &n, &k);
	dinamica();
	reconst(1, n, 1, 1);
	for (int i = 1; i <= n; ++i)
		printf("%d ", sol[i]);
}