Pagini recente » Cod sursa (job #256983) | Cod sursa (job #2114145) | Cod sursa (job #1601847) | Statistici Popa Maria (mrp482) | Cod sursa (job #24949)
Cod sursa(job #24949)
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
#define MAX_N 32
#define MAX_K 32
#define FIN "expresii2.in"
#define FOUT "expresii2.out"
#define ll long long
int N, K; char S[MAX_N], ch[MAX_K]; ll P;
map<string, ll> mem[MAX_N];
ll solve(int n, string p)
{
int i;
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));
if (p.size() < n || (p.size() == n && p[n-1] == '+'))
for (i = 1; i+1 < n; i++)
ret += solve(i, p.substr(0, i))*solve(n-i-1, p.size() < i ? "" : p.substr(i, n-i-1));
if (p.size() < n || (p.size() == n && p[n-1] == '*'))
for (i = 1; i+1 < n; i++)
ret += 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;
}