Cod sursa(job #1720915)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 23 iunie 2016 20:45:02
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>
#include <cstring>

int N, K;
long long V[64][64], P;

void read()
{
    scanf("%d %d %lld", &N, &K, &P);
}

void solve()
{
    V[0][0] = 1;
    for (int i = 0; i < N; i++)
        for (int j = 0; j <= i + 1; j++)
        {
            if (i && !j)
                continue;
            if (j)
                V[i + 1][j - 1] += V[i][j] * K;
            if (i != N - 1)
            {
                if (!j)
                    V[i + 1][j + 1] += V[i][j];
                else
                    V[i + 1][j] += V[i][j];
            }
            if (j)
                V[i + 1][j + 1] += 2 * V[i][j];
            else
                V[i + 1][j + 2] += 2 * V[i][j];
        }

    printf("%lld\n", V[N][0]);
}

void getexpr()
{
    char p[64];
    int nrv = 0, ind = 0;

    memset(p, 0, sizeof(p));
    V[0][1] = 1;
    for (int i = 0; i < N; i++)
    {
        int k;
        for (k = 'A'; k - 'A' < K; k++)
        {
            P -= V[N - i - 1][nrv + 1];
            if (P <= 0)
            {
                P += V[N - i - 1][nrv + 1];
                break;
            }
        }

        if (k - 'A' < K)
        {
            p[ind++] = k;
            nrv++;
        }
        else
        {
            int flag = 0;

            if (nrv >= 2)
            {
                P -= V[N - i - 1][nrv - 1];
                if (P <= 0)
                {
                    P += V[N - i - 1][nrv - 1];
                    p[ind++] = '+';
                    nrv--;
                    flag = 1;
                }
            }

            if (flag)
                continue;
            if (nrv >= 2)
            {
                P -= V[N - i - 1][nrv - 1];
                if (P <= 0)
                {
                    P += V[N - i - 1][nrv - 1];
                    p[ind++] = '*';
                    nrv--;
                    flag = 1;
                }
            }

            if (flag)
                continue;
            p[ind++] = '!';
        }
    }

    printf("%s\n", p);
}

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

    read();
    solve();
    getexpr();

    return 0;
}