Cod sursa(job #331073)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 12 iulie 2009 16:14:31
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>
int L,a,n,sol[110],k[100],
N[110][110][110],A[110][110][110],AT[110][110],NT[110][110],LC,x,CC,mic(int *u,int *v);
void read(),solve(),init1(int *u),printez(int *u),
atrib(int *u,int *v),adun(int *u,int *v),scad(int *u,int *v);
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	char ks[100];
	int j;
	freopen("pavare2.in","r",stdin);
	freopen("pavare2.out","w",stdout);
	scanf("%d%d%d",&L,&a,&n);
	scanf("%s",ks);
	for(x=0;ks[x];++x);
	k[0]=x;
	for(j=x;j>=1;j--)k[j]=ks[x-j]-'0';
}
void solve()
{
	for(LC=1;LC<=L;LC++)
	{
		for(x=1;x<=a;x++)
		{
			if(x>LC);
			else
			if(x==LC)init1(A[LC][x]);
			else
			if(x==1)atrib(A[LC][x],NT[LC-1]);
			else
			atrib(A[LC][x],A[LC-1][x-1]);
			adun(AT[LC],A[LC][x]);
		}
		for(x=1;x<=n;x++)
		{
			if(x>LC);
			else
			if(x==LC)init1(N[LC][x]);
			else
			if(x==1)atrib(N[LC][x],AT[LC-1]);
			else
			atrib(N[LC][x],N[LC-1][x-1]);
			adun(NT[LC],N[LC][x]);
		}
	}
	adun(sol,NT[L]);
	adun(sol,AT[L]);
	printez(sol);
	LC=L;
	if(mic(AT[L],k)){scad(k,AT[L]);CC=1;}
	for(;;)
	{
		if(!LC)return;
		if(CC==0)
		{
			for(x=a;;x--)
			{
				if(x>LC)continue;
				if(mic(A[LC][x],k))scad(k,A[LC][x]);
				else break;
			}
			LC-=x;CC=1;
			for(;x;x--)printf("0");
		}
		else
		{
			for(x=1;;x++)
			{
				if(mic(N[LC][x],k))scad(k,N[LC][x]);
				else break;
			}
			LC-=x;CC=0;
			for(;x;x--)printf("1");
		}
		if(!LC)break;
	}
}
void init1(int *u)
{
	u[0]=u[1]=1;
}
void atrib(int *u,int *v)
{
	int j,LL=v[0];
	for(j=0;j<=LL;j++)u[j]=v[j];
}
void adun(int *u,int *v)
{
	int j,LL;LL=u[0]>v[0]?u[0]:v[0];
	for(j=1;j<=LL;j++)u[j]+=v[j];
	for(j=1;j<=LL;j++)if(u[j]>9){u[j+1]++;u[j]-=10;}
	if(u[LL+1])LL++;
	u[0]=LL;
}
void printez(int *u)
{
	int j,LL=u[0];
	if(!LL){printf("0\n");return;}
	for(j=LL;j;j--)printf("%d",u[j]);
	printf("\n");
}
int mic(int *u,int *v)
{
	int LL;
	LL=u[0]>v[0]?u[0]:v[0];
	for(;LL;LL--)if(u[LL]-v[LL])return u[LL]<v[LL]?1:0;
	return 0;
}
void scad(int *u,int *v)
{
	int j,LL=u[0];
	for(j=1;j<=LL;j++)u[j]-=v[j];
	for(j=1;j<=LL;j++)if(u[j]<0){u[j]+=10;u[j+1]--;}
	for(j=LL;j>=0;j--)if(u[j])break;
	u[0]=j;
}