Pagini recente » Cod sursa (job #874558) | Istoria paginii runda/simulare_republicana_4 | Cod sursa (job #2827880) | Cod sursa (job #2748021) | Cod sursa (job #2226112)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("planeta.in");
ofstream cout("planeta.out");
const long long C = 9223372036854775807;
vector < int > ans;
bool viz[50];
int n;
long long m, d[50];
void recon(bool right, long long p, int dad) {
int st(0), dr(n - ans.size() - 1);
for (int i = 1; i <= n; ++i) {
if (viz[i])
continue;
if (d[st] <= m / d[dr] / p)
m -= d[st] * d[dr] * p;
else {
if (right && i < dad) {return;}
if (!right && i > dad) {return;}
ans.push_back(i);
viz[i] = true;
recon(0, p * d[dr], i);
recon(1, p, i);
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);
for (int i = 0; i < n; ++i)
cout << ans[i] << ' ';
return 0;
}