Pagini recente » Cod sursa (job #986330) | Cod sursa (job #1337572) | Cod sursa (job #170648) | Cod sursa (job #1754249) | Cod sursa (job #2899052)
#include <fstream>
#include <vector>
std::vector<long long> catalan;
void print_kth_preorder(int start, int end, long long k, std::ostream &os) {
if (start > end)
return;
int root;
for (root = start; root < end; ++root) {
auto left_subtree_possibilities = catalan[root - start];
auto right_subtree_possibilities = catalan[end - root];
auto tree_count =
left_subtree_possibilities * right_subtree_possibilities;
if (tree_count > k) {
break;
}
k -= tree_count;
}
os << root << ' ';
print_kth_preorder(start, root - 1, k / catalan[end - root], os);
print_kth_preorder(root + 1, end, k % catalan[end - root], os);
}
void print_kth_preorder(int n, long long k, std::ostream &os) {
print_kth_preorder(1, n, k, os);
}
int main() {
std::ifstream ifs("planeta.in");
int n, k;
ifs >> n >> k;
ifs.close();
catalan.resize(n + 1);
catalan[0] = 1;
catalan[1] = 1;
for (int i = 2; i <= n; ++i) {
catalan[i] = 0;
for (int j = 0; j <= i - 1; ++j) {
catalan[i] += catalan[j] * catalan[i - 1 - j];
}
}
std::ofstream ofs("planeta.out");
print_kth_preorder(n, k - 1, ofs);
ofs << '\n';
ofs.close();
return 0;
}