Cod sursa(job #911989)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 11 martie 2013 23:37:48
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 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;
}