Cod sursa(job #841135)

Utilizator stoicatheoFlirk Navok stoicatheo Data 23 decembrie 2012 20:22:14
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
# include <cstdio>
 
typedef long long ll;
const char *FIN = "expresii2.in", *FOU = "expresii2.out" ;
const int MAX = 31;
 
ll A[MAX][MAX][MAX], B[MAX], P, solution;
int N, M ;
 
int main (void) {
    fscanf (fopen (FIN, "r"), "%d %d %lld", &N, &M, &P) ;
 
    A[0][1][0] = 1;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j <= N; ++j) {
            for (int k = 0; k <= M + 2; ++k) {
                if (A[i][j][k] == 0) continue ;
                if (j < N - i) A[i + 1][j][M + 2] += A[i][j][k];
                if (j > 1 || j == 1 && i == N - 1)
                    for (int l = 0; l < M; ++l)
                        A[i + 1][j - 1][l] += A[i][j][k];
                if (j < N - i - 1)
                    A[i + 1][j + 1][M] += A[i][j][k], A[i + 1][j + 1][M + 1] += A[i][j][k] ;
            }
        }
    }
    for (int i = 0; i < M + 2; ++i) solution += A[N][0][i];
 
    for (int i = N, poz = 0; i ; --i) {
        for (int j = 0; j <= M + 2; ++j) {
            if (A[i][poz][j] < P) P -= A[i][poz][j];
            else {
                B[N - i + 1] = j;
                poz += (j < M ? 1 : (j < M + 2 ? -1 : 0));
                j = M + 3;
                break ;
            }
        }
    }
 
    freopen (FOU, "w", stdout) ;
 
    printf ("%lld\n", solution) ;
    for (int i = 1; i <= N; ++i)
        printf ("%c", (B[i] < M ? (char) B[i] + 'A' : (B[i] == M ? '+' : (B[i] == M + 1 ? '*' : B[i] == M + 2 ? '!' : '\0'))));
}