Cod sursa(job #2126194)

Utilizator AlexVolatiluVoicu Alex AlexVolatilu Data 9 februarie 2018 12:45:14
Problema Planeta Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>

using namespace std;

long long v[31][31];


void rec(int n, long long k, int off)
{
    if(n == 0) return;
    if(n == 1) {printf("%d ", off + 1);return;}

    int i = 1;
    while(k >= v[i - 1][n - i])
    {
        k -= v[i - 1][n - i];
        i++;
    }
    printf("%d ", i + off);

    if(k <= v[n - i][0])
    {
        rec(i - 1, 0, off);
        rec(n - i, k, i + off);
    }
    else if(n == i)
    {
        rec(i - 1, k, off);
        rec(n - i, 0, i + off);
    }
    else
    {
        rec(i - 1, k / v[n - i][0], off);
        rec(n - i, k % v[n - i][0], i + off);
    }
}

int main()
{
    freopen("planeta.in","r",stdin);
    freopen("planeta.out","w",stdout);

    int n;
    long long k;
    scanf("%d%lld", &n, &k);
    int i, j;
    v[0][0] = 0;
    v[0][1] = 1;
    v[1][0] = 1;
    v[1][1] = 1;

    for(i = 2; i<=n; i++)
    {
        //v[i][0] = v[0][i] = 0;
        for(j = 0; j < i; j++)
        {
            v[i][0] += v[j][i -1 -j];
            v[0][i] += v[j][i -1 -j];
        }
        for(j = 1; j < i; j++)
        {
            v[i - j][j] = v[i - j][0] * v[j][0];
        }
    }

    for(i = 0; i<=n; i++)
    {
        for(j=0;j<=n;j++)
            printf("%4lld ", v[i][j]);
        printf("\n");
    }


    rec(n, k-1, 0);


    return 0;
}