Pagini recente » Cod sursa (job #2733605) | Cod sursa (job #879587) | Cod sursa (job #2863942) | Cod sursa (job #953139) | Cod sursa (job #2898240)
#include <fstream>
#include <array>
using namespace std;
//ma doare fizic sa fac variabile globale
//dar altfel recursia ar fi foarte greu de facut
// si mi-e lene sa fac iterativ acum
array<int, 30> preorder;
array<long long, 31> catalanNrs;
void kthPreorder(int pos,int lower_bound, int upper_bound,long long k)
{
int i = lower_bound;
long long count = 0;
while(i < upper_bound - 1)
{
if (count + catalanNrs[i - lower_bound]*catalanNrs[upper_bound - i - 1] > k)
{
break;
}
count += catalanNrs[i - lower_bound]*catalanNrs[upper_bound - i - 1];
++i;
}
preorder[pos] = i + 1;
k -= count;
if (i - lower_bound > 0)
kthPreorder(pos + 1, lower_bound, i, k / catalanNrs[upper_bound - i - 1]);
if (upper_bound - i - 1 > 0)
kthPreorder(pos + i - lower_bound + 1, i + 1, upper_bound, k % catalanNrs[upper_bound - i - 1]);
}
void computeCatalan(int n)
{
catalanNrs[0] = catalanNrs[1] = 1;
for (int i = 2; i <= n; ++i)
{
catalanNrs[i] = 0;
for (int j = 0; j < i; ++j)
catalanNrs[i] += catalanNrs[j] * catalanNrs[i - j - 1];
}
}
int main()
{
ifstream in("planeta.in");
ofstream out("planeta.out");
int n;
long long k;
in >> n >> k;
in.close();
computeCatalan(n);
kthPreorder(0, 0, n, k-1);
for (int i = 0; i < n; ++i)
out << preorder[i] << " ";
return 0;
}