Cod sursa(job #481727)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 1 septembrie 2010 15:02:46
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <stdio.h>
#include <string.h>
#define Nmax 102
#define Cmax 102

int N,A,B;
char s[Cmax];
int K[Cmax],rez[Cmax];
int a[Nmax][Nmax][2][Cmax];

void adun(int a[],int b[]){
	int i,t=0;
	for(i=1; i<=a[0] || i<=b[0] || t; ++i,t/=10)
		a[i]=(t+=a[i]+b[i])%10;
	a[0]=i-1;
}
void scad(int a[],int b[]){
	int i,t=0;
	for(i=1; i<=a[0]; ++i){
		if( a[i]-b[i]-t >=0 ) a[i]=a[i]-b[i]-t, t=0;
		else a[i]=a[i]-b[i]-t+10, t=1;
	}
	while( !a[a[0]] ) --a[0];
}
inline int mai_mare(int a[],int b[]){
	int i;
	if( a[0] > b[0] ) return 1;
	if( a[0] < b[0] ) return 0;
	for(i=a[0];i>=1;--i){
		if( a[i] > b[i] ) return 1;
		if( a[i] < b[i] ) return 0;
	}
	return 1;
}	

void write_sol(){
	int i,j,now=0;
	
	do{
	if( now == 0 )
		for(i=A;i>=0;--i){
			if( mai_mare(a[N][i][0],K) ){
				for(j=1;j<=i;++j) printf("%d",0);
				N-=i;
				now=1;
				break;
			}
			else scad(K,a[N][i][0]);
		}
	else
		for(i=1;i<=B;++i){
			if( mai_mare(a[N][i][1],K) ){
				for(j=1;j<=i;++j) printf("%d",1);
				N-=i;
				now=0;
				break;
			}
			else scad(K,a[N][i][1]);
		}
	} while( N );
}

int main(){
	int i,j,aux;
	freopen("pavare2.in","r",stdin);
	freopen("pavare2.out","w",stdout);
	scanf("%d%d%d\n",&N,&A,&B);
	scanf("%s",s);
	for(i=0; s[i]>='0' && s[i]<='9'; ++i)
		K[i+1]=s[i]-'0';
	K[0]=i;
	for(i=1;i<=K[0]/2;++i) aux=K[i],K[i]=K[K[0]-i+1],K[K[0]-i+1]=aux;
	
	a[1][0][0][0]=a[1][0][0][1]=1;
	a[1][1][0][0]=a[1][1][0][1]=1;
	a[1][0][1][0]=a[1][0][1][1]=1;
	a[1][1][1][0]=a[1][1][1][1]=1;
	for(i=2;i<=N;++i){
		for(j=1;j<=A && j<=i;++j){
			memcpy(a[i][j][0],a[i-1][j-1][0],sizeof(a[i-1][j-1][0]));
			adun(a[i][0][1],a[i][j][0]);
		}
		for(j=1;j<=B && j<=i;++j){
			memcpy(a[i][j][1],a[i-1][j-1][1],sizeof(a[i-1][j-1][1]));
			adun(a[i][0][0],a[i][j][1]);
		}
	}
	
	memcpy(rez,a[N][0][0],sizeof(a[N][0][0]));
	adun(rez,a[N][0][1]);
	for(i=rez[0];i>=1;--i) 
		printf("%d",rez[i]);
	printf("\n");
	
	write_sol();
	printf("\n");
	fclose(stdin); fclose(stdout);
	return 0;
}