Pagini recente » Cod sursa (job #3283099) | Cod sursa (job #3198684) | Cod sursa (job #2877569) | Cod sursa (job #2628265) | Cod sursa (job #3135860)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("planeta.in");
ofstream fout("planeta.out");
long long CatalanNumber[40];
void calcCatalan(int n)
{
CatalanNumber[0] = 1;
CatalanNumber[1] = 1; // radacina 1 => toate elementele sunt in dreapta
for(int i = 2; i <= n; i++){
CatalanNumber[i] = 0;
for(int j = 0; j < i; j++){
CatalanNumber[i] += CatalanNumber[j] * CatalanNumber[i - j - 1];
}
}
}
void findBST(long long k, int n, int node)
{
if(node > n)
return;
int nextNode = node;
while(CatalanNumber[nextNode - node] * CatalanNumber[n - nextNode] <= k && nextNode <= n)
{
k = k - CatalanNumber[nextNode - node] * CatalanNumber[n - nextNode];//sar peste toate permutarile pana la a k a
nextNode++;
}
fout << nextNode << " ";
if (node < nextNode && CatalanNumber[n - nextNode]) // mai am ce sa pun la stanga
findBST(k / CatalanNumber[n - nextNode], nextNode - 1, node);
if (nextNode < n && CatalanNumber[n - nextNode]) // mai am ce sa pun la dreapta
findBST(k % CatalanNumber[n - nextNode], n, nextNode + 1);
}
int main()
{
int n;
long long k;
fin >> n >> k;
k--;
calcCatalan(n);
findBST(k, n, 1);
return 0;
}