Cod sursa(job #3135860)

Utilizator RealDream21Fabian-Andrei RealDream21 Data 4 iunie 2023 16:14:49
Problema Planeta Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("planeta.in");
ofstream fout("planeta.out");

long long 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 && CatalanNumber[n - nextNode]) // mai am ce sa pun la stanga
        findBST(k / CatalanNumber[n - nextNode], nextNode - 1, node);
    if (nextNode < n && CatalanNumber[n - nextNode]) // 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;
    k--;
    calcCatalan(n);

    findBST(k, n, 1);

    return 0;
}