Cod sursa(job #2226120)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 29 iulie 2018 18:09:51
Problema Planeta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#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;
}