Cod sursa(job #1731763)

Utilizator akaprosAna Kapros akapros Data 19 iulie 2016 20:31:00
Problema Expresii 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
#define maxN 32
#define maxV 4
#define ll long long
using namespace std;
int n, K;
ll p;
ll dp[maxN][maxN][maxV];
void read()
{
    freopen("expresii2.in", "r", stdin);
    scanf("%d %d %lld", &n, &K, &p);
}
void solve()
{
    int i, j;
    dp[0][1][0] = 1LL;
    dp[0][1][3] = 1LL;
    for (i = 1; i <= n; ++ i)
        for (j = 0; j <= n; ++ j)
        {
            if (j < n)
                dp[i][j][0] += dp[i - 1][j + 1][3];
            if (j > 1)
                dp[i][j][1] += dp[i - 1][j - 1][3];
            if (j)
                dp[i][j][2] += dp[i - 1][j][3];
            dp[i][j][0] = 1LL * K * dp[i][j][0];
            dp[i][j][1] = 2LL * dp[i][j][1];
            dp[i][j][3] = dp[i][j][0] + dp[i][j][1] + dp[i][j][2];
        }
}
void get_sol()
{
    int i = n, j = 0, k;
    while (i)
    {
        for (k = 0; k < 3; ++ k)
            if (dp[i][j][k] <= p)
                p -= dp[i][j][k];
            else
                break;
        if (k == 0)
        {
            ++ j;
            ll var = p / (dp[i][j][0] / K);
            printf("%c", var + 'A');
            p -= var * (dp[i][j][0] / K);
        }
        else if (k == 1)
        {
            ll sgn = p / (dp[i][j][1] / 2);
            if (sgn)
                printf("+");
            else
                printf("*");
            p -= sgn * (dp[i][j][1] / 2);
            -- j;
        }
        else
            printf("!");
        -- i;
    }
}
void write()
{
    freopen("expresii2.out", "w", stdout);
    printf("%lld\n", dp[n][0][3]);
    get_sol();
}
int main()
{
    read();
    solve();
    write();
    return 0;
}