Cod sursa(job #2751631)

Utilizator XeinIonel-Alexandru Culea Xein Data 15 mai 2021 14:13:42
Problema Planeta Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>

std::ifstream f("planeta.in");
std::ofstream g("planeta.out");

short Arbore[80000];
short N;
long long K;

long long Numarul_Catalan(unsigned n)  // Numarul de BST cu N noduri
{
    /// Redus la ((n+2) * (n+3)* ... * 2n) / n!
    if(n == 0 || n == 1)
        return 1;
    long long produs = 1;
    for(unsigned i = n + 2; i <= n * 2; ++i)
        produs *= i;
    long long n_factorial = 1;
    for(unsigned i = 2; i <= n; ++i)
        n_factorial *= i;
    return 1LL * produs / n_factorial;
}

void constr_Arbore(short min_nod, short max_nod, long long k, short poz)
{
    if(min_nod <= max_nod)
    {
        Arbore[poz] = min_nod;
        long long Nr_arb_st = Numarul_Catalan(Arbore[poz] - min_nod);
        long long Nr_arb_dr = Numarul_Catalan(max_nod - Arbore[poz]);
        while(Nr_arb_st * Nr_arb_dr < k)
        {
            k -= Nr_arb_st * Nr_arb_dr;
            ++Arbore[poz];
            Nr_arb_st = Numarul_Catalan(Arbore[poz] - min_nod);
            Nr_arb_dr = Numarul_Catalan(max_nod - Arbore[poz]);
        }

        long long k_st = 1;
        while(Nr_arb_dr < k)
        {
            k -= Nr_arb_dr;
            ++k_st;
        }

        constr_Arbore(min_nod, Arbore[poz] - 1, k_st, 2 * poz);
        constr_Arbore(Arbore[poz] + 1, max_nod, k, 2 * poz + 1);
    }
}

void preordine(short poz)
{
    if(Arbore[poz] != 0)
    {
        g << Arbore[poz] << ' ';
        preordine(2 * poz);
        preordine(2 * poz + 1);
    }
}

int main()
{
    f >> N >> K;
    constr_Arbore(1, N, K, 1);
    preordine(1);

    return 0;
}