Pagini recente » Cod sursa (job #566742) | Cod sursa (job #280750) | Cod sursa (job #514152) | Cod sursa (job #3134282) | Cod sursa (job #254459)
Cod sursa(job #254459)
#include <algorithm>
#include <stdio.h>
#include <vector>
#define ll long long
using namespace std;
int n;
ll k;
ll vctPrecCant[64];
int vctSol[64];
void baga(int first, int last, int difNivel, ll alKlea)
{
int lung = last - first + 1;
for (int x = 1; x <= lung; x++)
{
if (alKlea <= vctPrecCant[x - 1] * vctPrecCant[lung - x])
{
vctSol[first] = x + difNivel;
baga(first + 1, first + x - 1, difNivel, (alKlea - 1) / vctPrecCant[lung - x] + 1);
baga(first + x, last, difNivel + x, (alKlea - 1) % vctPrecCant[lung - x] + 1);
break;
}
else alKlea -= vctPrecCant[x - 1] * vctPrecCant[lung - x];
}
}
int main()
{
freopen("planeta.in", "r", stdin);
freopen("planeta.out", "w", stdout);
scanf("%d %lld", &n, &k);
// precalculez:)
vctPrecCant[0] = vctPrecCant[1] = 1;
for (int i = 2; i <= n; i++)
for (int x = 0; x < i; x++)
vctPrecCant[i] += vctPrecCant[x] * vctPrecCant[i - 1 - x];
// calculez:)
baga(1, n, 0, k);
for (int i = 1; i <= n; i++)
printf("%d ", vctSol[i]);
fclose(stdin);
fclose(stdout);
return 0;
}