Pagini recente » Rating Sachelarie Raluca (lalainfo) | Cod sursa (job #2282567) | Cod sursa (job #892178) | Cod sursa (job #381747) | Cod sursa (job #595080)
Cod sursa(job #595080)
# include <map>
# include <string>
# include <fstream>
using namespace std ;
typedef long long ll;
const char *FIN = "expresii2.in", *FOU = "expresii2.out" ;
const int MAX = 31;
int N, K;
string A, B ;
map <string, ll> M[MAX];
ll solution, P, k;
inline int check (string S, int N, char ch) {
return ((int) S.size () < N || ((int) S.size () == N && S[N - 1] == ch));
}
ll doit (int N, string S) {
ll sol = 0;
if (N == 1) return S.size () ? (S[0] >= 'A' && S[0] <= 'Z' ? 1 : 0) : K;
if (M[N].count (S) > 0) return M[N][S];
if ((int) S.size () < N || ((int) S.size () == N && S[N - 1] == '!'))
sol = doit (N - 1, S.substr (0, N - 1));
for (int i = 1, j = check (S, N, '+') + check (S, N, '*'); i < N - 1; ++i) {
sol += j * doit (i, S.substr (0, i)) * doit (N - i - 1, (int) S.size () < i ? "" : S.substr (i, N - i - 1));
}
M[N][S] = sol;
return sol;
}
int main (void) {
ifstream f (FIN) ;
f >> N >> K >> P ;
fscanf (fopen (FIN, "r"), "%d %d %lld", &N, &K, &P) ;
ofstream g (FOU) ;
g << doit (N, "") << "\n";
for (int i = 0; i < K; ++i) A += 'A' + i;
A += '+', A += '*', A += '!';
for (int i = 0; i < N; ++i) {
B += " ";
for (int j = 0; j < K + 3; ++j) {
B[i] = A[j], k = doit (N, B) ;
if (P <= (solution += k)) {
solution -= k;
break ;
}
}
}
g << B ;
}