Pagini recente » Cod sursa (job #525061) | Cod sursa (job #1287543) | Cod sursa (job #1799714) | Cod sursa (job #1703668) | Cod sursa (job #2751631)
#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;
}