Pagini recente » Cod sursa (job #692611) | Cod sursa (job #684862) | Monitorul de evaluare | Cod sursa (job #1088256) | Cod sursa (job #595081)
Cod sursa(job #595081)
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>
#include <fstream>
#include <cstring>
using namespace std;
#define MAX_N 32
#define FIN "expresii2.in"
#define FOUT "expresii2.out"
#define ll long long
ofstream f("try22.in") ;
int N, K; char S[MAX_N], ch[MAX_N]; ll P;
map<string, ll> mem[MAX_N];
inline bool check (string S, int N, char ch) {
return (S.size() < N || (S.size() == N && S[N - 1] == ch));
}
string sub (string p, int st, int dr) {
f << "p = " << p << " st = " << st << " dr = " << dr << " rez = " << p.substr(st, dr) << " " << "strlen " << p.substr(st,dr).size() << "\n";
return p.substr(st, dr);
}
ll solve(int n, string p)
{
int i, ok;
ll ret = 0;
f << n << "\n";
if (n == 1)
return !p.size() ? K : p[0] >= 'A' && p[0] <= 'Z' ? 1 : 0;
if (mem[n].count(p) > 0) return mem[n][p];
if (p.size() < n || (p.size() == n && p[n-1] == '!'))
ret = solve(n-1, sub(p,0, n-1));
ok = check (p, n, '+') + check (p, n, '*');
for (i = 1; i+1 < n; i++) {
f << n << " " << i << " " << n - i - 1 << " " << p.size () << "\n" ;
//printf ("%d %d\n", i, N - i - 1) ;
ret += ok*solve(i, sub(p,0, i))*solve(n-i-1, p.size() < i ? "" : sub(p,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, ""));
f << "STOP\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++)
{f << S << " " ;
S[i] = ch[j];
ll x = solve (N, S) ;
ret += x; f << "TE\n" ;
if (P <= ret) { ret -= x; break; }
}
printf("%s\n", S);
return 0;
}