Pagini recente » Cod sursa (job #1361866) | Cod sursa (job #2942105) | Cod sursa (job #1230135) | Cod sursa (job #2140153) | Cod sursa (job #3135006)
#include <iostream>
#include<fstream>
using namespace std;
ifstream in("planeta.in");
ofstream out("planeta.out");
long long val[31];
void Init(int n) /// calculez numarul total de arbori de cautare pentru fiecare numar de noduri
{
val[0]=1;
val[1]=1;
for(int i=2; i<=n; i++)
for(int j=1; j<=i; j++)
val[i]+=val[j-1]*val[i-j];
}
void calculare(int stanga, int dreapta, long long k) /// construiesc al K-lea arborele binar de căutare în ordine lexicografică
{
int nod;
if(stanga>dreapta)
return;
for(int i=stanga; i<=dreapta ; ++i) /// alegem radacina in functie de k
{
if(val[i-stanga]*val[dreapta-i]>k)
{
nod=i;
break;
}
k-=val[i-stanga]*val[dreapta-i];
nod=i;
}
out<<nod<<" ";
if(nod>stanga) ///construim subarborele stang
calculare(stanga, nod-1, k/val[dreapta-nod]);
if(nod<dreapta) /// construim subarborele drept
calculare(nod+1, dreapta, k%val[dreapta-nod]);
}
int main()
{
int n;
long long k;
in>>n>>k;
Init(n);
// for(int i=0;i<=30;i++)
// cout<<val[i]<<" ";
// cout<<endl;
calculare(1,n,k-1);
}