Cod sursa(job #36848)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 24 martie 2007 10:55:38
Problema Pavare2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
# include <stdio.h>
# include <string.h>

# define  _fin  "pavare2.in"
# define  _fout "pavare2.out"

# define  maxn	101


int n, a, b, k[maxn], aux[maxn],
	w[maxn][maxn][maxn], bl[maxn][maxn][maxn],
	i, j, l, ns[maxn],
	sol[maxn], set[maxn];
char ch;

void add(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 sub(int a[], int b[])
{
	int i, t=0;
	for (i=1; i<=a[0]; i++)
		a[i] += (t = (a[i]-=b[i]+t) < 0) * 10;
	for (; a[0] > 1 && ! a[a[0]]; a[0]--);
}
int cmp(int a[], int b[])
{
	if ( a[0]-b[0] ) return a[0]-b[0];
	for (int i=a[0]; i>=1; i--)
		if ( a[i]-b[i] ) return a[i]-b[i];
	return 0;
}

int main()
{
	freopen(_fin, "r", stdin);
	freopen(_fout,"w", stdout);
	
	scanf("%d%d%d\n", &n, &a, &b);
	while ( ch!='\n' ) {
		scanf("%c", &ch);
		if ( ch != '\n' ) k[++k[0]]=ch-=0x30;
	}
	for (i=1; i<k[0]>>1; i++) k[i]^=k[k[0]-i+1]^=k[i]^=k[k[0]-i+1];
	
	w[1][1][0]=w[1][1][1]=bl[1][1][0]=bl[1][1][1]=1;
	
	for (i=2; i<=n; i++)
	{
		//for (j=2; j<=a; j++) w[i][j]+=w[i-1][j-1];
		for (j=2; j<=a; j++) add(w[i][j], w[i-1][j-1]);
		//for (j=2; j<=b; j++) bl[i][j]+=bl[i-1][j-1];
		for (j=2; j<=b; j++) add(bl[i][j], bl[i-1][j-1]);
		//for (j=1; j<=b; j++) w[i][1]+=bl[i-1][j];
		for (j=1; j<=b; j++) add(w[i][1], bl[i-1][j]);
		//for (j=1; j<=a; j++) bl[i][1]+=w[i-1][j];
		for (j=1; j<=a; j++) add(bl[i][1], w[i-1][j]);
	}
	
	//for (i=1; i<=a; i++) ns += w[n][i];
	for (i=1; i<=a; i++) add(ns, w[n][i]);
	//for (i=1; i<=b; i++) ns += bl[n][i];
	for (i=1; i<=b; i++) add(ns, bl[n][i]);
	
	//printf("%d\n", ns);
	for (i=ns[0]; i>=1; i--) printf("%d", ns[i]); printf("\n");

	for (i=n; i>=1; i--)
	{
		for (j=a; j>=1; j--)
			//if ( w[i][j] >= k ) {
			if ( cmp(w[i][j], k) >= 0 ) {
				//
				//for (l=1; l<j; l++) sub(k, w[i][l]);
				// punem o secventa 0...01
				for (l=1; l<=j; l++, i--)
					sol[i]=0, set[i]=1;
				sol[i]=set[i]=1;
				
				break;
			}
			//else k-=w[i][j];
			else sub(k, w[i][j]);
		
		for (j=1; j<=b; j++)
			//if ( bl[i][j] >= k ) {
			if ( cmp(bl[i][j], k) >= 0 ) {
				//
				//for (l=1; l<j; l++) sub(k, bl[i][l]);
				//
				for (l=1; l<=j; l++, i--)
					sol[i]=set[i]=1;
				i++;
				
				break;
			}
			//else k-=bl[i][j];
			else sub(k, bl[i][j]);
	}

	for (i=n; i>=1; i--) printf("%d", sol[i]);
	printf("\n");

	return 0;
}