Cod sursa(job #303631)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 10 aprilie 2009 03:09:39
Problema Planeta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <algorithm>
#define FIN "planeta.in"
#define FOUT "planeta.out"
#define MAX 40
using namespace std;
int N;
long long K;
struct tree{
	int inf;
	tree *stanga, *dreapta;
} *T;
int cnt=0;
long long memo[MAX];




void get_memo(void){
	
	memo[0]=1;
	memo[1]=1;
	for (int i=2;i<=N;++i){
		memo[i]=0;
		for (int aux=1;aux<=i;++aux) memo[i]+=memo[aux-1]*memo[i-aux];
	}
}

void get(int lower,int upper,long long K,tree *T){

	if (lower==upper){T->inf=lower;return ;}
	long long sum=0,scurrent;
	
	T->inf=lower;
	int ok=1;
	long long pstanga,pdreapta;
	while (ok){
		pstanga=memo[T->inf-1-lower+1];
		pdreapta=memo[upper-T->inf];
		scurrent=pstanga*pdreapta;
		if (sum+scurrent<K){sum+=scurrent;++T->inf;} else {ok=0;}
	}
	
	long long ceva=K-sum;
	long long Kstanga=ceva/pdreapta +1;
	long long Kdreapta=ceva%pdreapta;
	if (Kdreapta==0){--Kstanga; Kdreapta=pdreapta;}

	if (T->inf<upper){
		T->dreapta=new tree;
		T->dreapta->stanga=NULL;
		T->dreapta->dreapta=NULL;
	}
	if (T->inf>lower){
		T->stanga=new tree;
		T->stanga->stanga=NULL;
		T->stanga->dreapta=NULL;
	}
	if (T->inf>lower) get(lower,T->inf-1,Kstanga,T->stanga);
	if (T->inf<upper) get(T->inf+1,upper,Kdreapta,T->dreapta);
}



void afis(tree *T){
	++cnt;
	if (cnt<N){
	printf("%d ",T->inf);
	} else {printf("%d\n",T->inf);}
	if (T->stanga){ afis (T->stanga);}
	if (T->dreapta) { afis (T->dreapta); }
}

void iofile(void){

	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);

	scanf("%d%lld",&N,&K);

	fclose(stdin);
	return ;
}

void solve(void){

	T=new tree;
	T->stanga=NULL;
	T->dreapta=NULL;
	get_memo();
	get(1,N,K,T);
	afis(T);
	fclose(stdout);
}

int main(void){
	iofile();
	solve();
	return 0;
}