Pagini recente » Cod sursa (job #1305461) | Cod sursa (job #1130069) | Cod sursa (job #1596680) | Cod sursa (job #633147) | Cod sursa (job #2899005)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("planeta.in");
ofstream fout("planeta.out");
vector <int> create_catalan(int n)
{
vector <int> catalan(n+1);
catalan[0] = catalan[1] = 1;
for(int i = 2; i <= n; i++)
{
catalan[i] = 0;
for(int j = 0; j < i; j++)
catalan[i] += catalan[j] * catalan[i-j-1];
}
return catalan;
}
void find_preorder(int s, int f, long long k, vector<int>& catalan)
{
int root = s;
for(root = s; root < f; ++root)
{
long long num_trees = catalan[root - s] * catalan[f - root];
if(num_trees <= k)
k -= num_trees;
else break;
}
fout << root << " ";
if(root > s)
find_preorder(s, root-1, k / catalan[f - root], catalan);
if(root < f)
find_preorder(root+1, f, k % catalan[f - root], catalan);
}
int main()
{
int n;
long long k;
fin >> n >> k;
vector <int> catalan = create_catalan(n);
find_preorder(1, n, k-1, catalan);
}