Pagini recente » Cod sursa (job #935843) | Cod sursa (job #2168546) | Cod sursa (job #1157846) | Cod sursa (job #2846232) | Cod sursa (job #2897612)
#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;
}