Cod sursa(job #254743)

Utilizator savimSerban Andrei Stan savim Data 7 februarie 2009 13:57:13
Problema Planeta Scor 30
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 0.9 kb
#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;
}