Cod sursa(job #2226112)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 29 iulie 2018 17:45:20
Problema Planeta Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#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;
}