Cod sursa(job #2897612)

Utilizator NFJJuniorIancu Ivasciuc NFJJunior Data 4 mai 2022 11:26:47
Problema Planeta Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("planeta.in");
ofstream g("planeta.out");
#define cin f
#define cout g
const int Max = 1;

int n;
long long k, arb[31] = {1};
set < int > elem;

void RSD(int x, set < int > elem, int exp)
{
	cout<<x<<' ';
	int ok = 0;
	set < int > stanga, dreapta;
	for(auto it : elem)
	{
		if(it == x)
			ok = 1;
		else
			if(ok == 0)
				stanga.insert(it);
			else
				dreapta.insert(it);
	}
	elem.erase(x);
	int i = 0;
	exp *= arb[dreapta.size()];
	for(auto it : stanga)
	{
		i ++;
		if(arb[i - 1] * arb[stanga.size() - i] * exp > k)
		{
			RSD(it, stanga, exp);
			break;
		}
		k -= arb[i - 1] * arb[stanga.size() - i] * exp;
	}
	exp /= arb[dreapta.size()];
	i = 0;
	for(auto it : dreapta)
	{
		i ++;
		if(arb[i - 1] * arb[dreapta.size() - i] * exp > k)
		{
			RSD(it, dreapta, exp);
			break;
		}
		k -= arb[i - 1] * arb[dreapta.size() - i] * exp;
	}
	stanga.clear();
	dreapta.clear();
}
int main()
{
	cin >> n >> k;
	for(int i = 1; i <= n; i ++)
	{
		elem.insert(i);
		for(int j = 0; j <= i - 1; j ++)
			arb[i] += arb[j] * arb[i - j - 1];
	}
	k --;
	int i = 1;
	while(arb[i - 1] * arb[n - i] <= k)
	{
		k -= arb[i - 1] * arb[n - i];
		i ++;
	}
	RSD(i, elem, 1);
	return 0;
}