Pagini recente » Cod sursa (job #2757001) | Cod sursa (job #1543974) | Cod sursa (job #2991100) | Cod sursa (job #2133095) | Cod sursa (job #2226120)
#include <fstream>
using namespace std;
ifstream cin("planeta.in");
ofstream cout("planeta.out");
const long long C = 9223372036854775807;
bool viz[50];
int n;
long long m, d[50];
void recon(bool right, long long p, int dad, int st, int dr) {
for (int i = 1; i <= n && st >= 0 && dr >= 0; ++i) {
if (viz[i])
continue;
if (d[st] <= m / d[dr] / p && d[st] != C && d[dr] != C)
m -= d[st] * d[dr] * p;
else {
if (right && i < dad) {return;}
if (!right && i > dad) {return;}
cout << i << ' ';
viz[i] = true;
if (st != 0)
recon(0, p * d[dr], i, 0, st - 1);
if (dr != 0)
recon(1, p, i, 0, dr - 1);
return;
}
--dr;
++st;
}
}
int main()
{
cin >> n >> m;
d[0] = d[1] = 1;
for(int i = 2; i <= n; i++) {
for(int j = 0; j < i; j++) {
if (d[j] <= C / d[i - j - 1] && C - d[i] >= d[j] * d[i - j - 1])
d[i] += d[j] * d[i - j - 1];
else
d[i] = C;
}
}
m--;
recon(1, 1, 0, 0, n - 1);
return 0;
}