Pagini recente » Cod sursa (job #3202328) | Cod sursa (job #2316693) | Monitorul de evaluare | Cod sursa (job #2775261) | Cod sursa (job #303631)
Cod sursa(job #303631)
#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;
}