Cod sursa(job #2898240)

Utilizator widzAndrei-Daniel Tava widz Data 6 mai 2022 14:25:28
Problema Planeta Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#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;
}