Cod sursa(job #2899052)

Utilizator AndreiAncutaAndrei Ancuta AndreiAncuta Data 7 mai 2022 17:05:56
Problema Planeta Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#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;
}