Cod sursa(job #25859)

Utilizator dominoMircea Pasoi domino Data 4 martie 2007 15:24:50
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

#define MAX_N 32
#define FIN "expresii2.in"
#define FOUT "expresii2.out"
#define ll long long

int N, K; char S[MAX_N], ch[MAX_N]; ll P;
map<string, ll> mem[MAX_N];

ll solve(int n, string p)
{
    int i, ok;
    ll ret = 0;

    if (n == 1) return !p.size() ? K : p[0]  >= 'A' && p[0] <= 'Z' ? 1 : 0;
    if (mem[n].find(p) != mem[n].end()) return mem[n][p];
    if (p.size() < n || (p.size() == n && p[n-1] == '!'))
        ret = solve(n-1, p.substr(0, n-1));
    ok =  (p.size() < n || (p.size() == n && p[n-1] == '+')) +
          (p.size() < n || (p.size() == n && p[n-1] == '*'));
    for (i = 1; i+1 < n; i++)
        ret += ok*solve(i, p.substr(0, i))*solve(n-i-1, p.size() < i ? "" : p.substr(i, n-i-1));
    mem[n][p] = ret;
    return ret;
}

int main(void)
{
    int i, j;
    ll ret = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %lld", &N, &K, &P);

    printf("%lld\n", solve(N, ""));
    for (i = 0; i < K; i++) ch[i] = 'A'+i;
    ch[K] = '+'; ch[K+1] = '*'; ch[K+2] = '!';
    for (i = 0; i < N; i++)
        for (j = 0; j < K+3; j++)
        {
            S[i] = ch[j];
            ret += solve(N, S);
            if (P <= ret) { ret -= solve(N, S); break; }
        }
    printf("%s\n", S);

    return 0;
}