Cod sursa(job #254459)

Utilizator ProtomanAndrei Purice Protoman Data 7 februarie 2009 12:16:44
Problema Planeta Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.09 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define ll long long

using namespace std;

int n;
ll k;
ll vctPrecCant[64];
int vctSol[64];

void baga(int first, int last, int difNivel, ll alKlea)
{
	int lung = last - first + 1;

	for (int x = 1; x <= lung; x++)
	{
		if (alKlea <= vctPrecCant[x - 1] * vctPrecCant[lung - x])
		{
			vctSol[first] = x + difNivel;
			baga(first + 1, first + x - 1, difNivel, (alKlea - 1) / vctPrecCant[lung - x] + 1);
			baga(first + x, last, difNivel + x, (alKlea - 1) % vctPrecCant[lung - x] + 1);
			break;
		}
		else alKlea -= vctPrecCant[x - 1] * vctPrecCant[lung - x];
	}
}

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

	scanf("%d %lld", &n, &k);

	// precalculez:)
	vctPrecCant[0] = vctPrecCant[1] = 1;
	for (int i = 2; i <= n; i++)
		for (int x = 0; x < i; x++)
			vctPrecCant[i] += vctPrecCant[x] * vctPrecCant[i - 1 - x];

	// calculez:)
	baga(1, n, 0, k);

	for (int i = 1; i <= n; i++)
		printf("%d ", vctSol[i]);

	fclose(stdin);
	fclose(stdout);
	return 0;
}