Pagini recente » Cod sursa (job #871348) | Cod sursa (job #2564431) | Cod sursa (job #1890675) | Cod sursa (job #3260985) | Cod sursa (job #2899264)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("planeta.in");
ofstream fout("planeta.out");
long long t[32];
void catalan(int n)
{
t[0]=1;
t[1]=1;
for(int i=2;i<=n;i++)
{
for( int j=0;j<i;j++)
{
t[i]+=t[j]*t[i-j-1];
}
}
}
void gasire(int inceput, int nrnoduri, long long K)
{
///daca nu are noduri st/dr
if(nrnoduri==0)
{
return;
}
///daca mai are doar un nod
if(nrnoduri==1)
{
fout<<inceput+1<<" ";
return;
}
for(int i=1;i<=nrnoduri;i++)
{
long long nrperm=t[i-1]*t[nrnoduri-i];
if(nrperm<K)
{
K=K-nrperm;
}
else
{
///afisare radacina
fout<<inceput+i<<" ";
///stanga
gasire(inceput,i-1,(K-1)/(t[nrnoduri-i]+1));
///dreapta
gasire(inceput+i,nrnoduri-i,(K-1)%(t[nrnoduri-i]+1)); //ce ramane dupa traversare stanga
return;
}
}
}
int main()
{
int n;
long long k;
fin>>n>>k;
//generare numar de permutari pt n noduri https://www.youtube.com/watch?v=YDf982Lb84o
catalan(n);
gasire(0,n,k);
return 0;
}