Pagini recente » Cod sursa (job #366812) | Cod sursa (job #1836068) | Cod sursa (job #278481) | Cod sursa (job #336724) | Cod sursa (job #24946)
Cod sursa(job #24946)
#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
#define mp make_pair
int N, K; char S[MAX_N], ch[MAX_K]; ll P;
map < pair<int, string>, ll > mem;
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.find(mp(n, p)) != mem.end()) return mem[mp(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[mp(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;
}