Pagini recente » Cod sursa (job #2420218) | Cod sursa (job #2452324) | Cod sursa (job #1590767) | Cod sursa (job #542760) | Cod sursa (job #3135854)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("planeta.in");
ofstream fout("planeta.out");
int 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) // mai am ce sa pun la stanga
findBST(k / CatalanNumber[n - nextNode], nextNode - 1, node);
if (nextNode < n) // 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;
calcCatalan(n);
findBST(k, n, 1);
return 0;
}