Cod sursa(job #926487)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 25 martie 2013 11:18:32
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<stdio.h>
 
#define maxdim 33
#define sigma 29
 
FILE*f=fopen("expresii2.in","r");
FILE*g=fopen("expresii2.out","w");
 
int n,k;
const int op1 = 27,op2 = 28,NOT = 29;
long long p,D[maxdim][maxdim][maxdim];
int vsol[maxdim];
 
int main () {
     
    fscanf(f,"%d %d %lld",&n,&k,&p);
     
    D[n][2][op1] = D[n][2][op2] = D[n][0][NOT] = 1;
    for ( int i = n ; i >= 2 ; --i ){
         
        for ( int j = 0 ; j <= n ; ++j ){
             
            for ( int last = 1 ; last <= sigma ; ++last ){
             
                if ( j > 0 ){
                    for ( int now = 1 ; now <= k ; ++now ){
                        D[i-1][j-1][now] += D[i][j][last];
                    }
                }
                 
                D[i-1][j][NOT] += D[i][j][last];
                if ( j > 0 ){
                    D[i-1][j+1][op1] += D[i][j][last];
                    D[i-1][j+1][op2] += D[i][j][last];
                }
            }
        }
        D[i-1][2][op1] += 1;
        D[i-1][2][op2] += 1;
        for ( int now = 1 ; now <= k ; ++now ){
            D[i-1][0][now] += 1;
        }
    }
     
    long long sol = 0;
    for ( int i = 1 ; i <= k ; ++i ){
        sol += D[1][0][i];
    }
     
    int j = 0;
    for ( int i = 1 ; i <= n ; ++i ){
         
        for ( int c = 1 ; c <= sigma ; ++c ){
            if ( D[i][j][c] < p ){
                p -= D[i][j][c];
            }
            else{
                vsol[i] = c;
                if ( c == op1 || c == op2 ) --j;
                if ( c <= 26 && !(D[i][j][c] == p && i == 1) )   ++j;
                break ;
            }
        }
        if ( !vsol[i] ){
            vsol[i] = NOT;
        }
    }
     
    fprintf(g,"%lld\n",sol);
    for ( int i = 1 ; i <= n ; ++i ){
        if ( vsol[i] <= 26 ) vsol[i] += 'A'-1;
        else    if ( vsol[i] == 27 )    vsol[i] = '+';
        else    if ( vsol[i] == 28 )    vsol[i] = '*';
        else    if ( vsol[i] == 29 )    vsol[i] = '!';
         
        fprintf(g,"%c",vsol[i]);
    }
    fprintf(g,"\n");
     
    fclose(f);
    fclose(g);
     
    return 0;
}