Cod sursa(job #30997)

Utilizator therain3rVlad Dumitrescu therain3r Data 15 martie 2007 13:16:44
Problema Pavare2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
# include <stdio.h>

long long int k;
int n,a,b;

const int MAXN=100;

long long int c[MAXN+10][2];

int min(int a, int b)  {if (a>b) return b; return a;}

void calculeaza()
{
int i,j;
c[0][0]=1;c[0][1]=1;
for (i=1;i<=n;i++)
	{
	c[i][0]=c[i][1]=0;
	for (j=1;j<=min(i,a);j++) c[i][0]+=c[i-j][1];
	for (j=1;j<=min(i,b);j++) c[i][1]+=c[i-j][0];
	}
}

void citire()
{
FILE *f=fopen("pavare2.in","r");
fscanf(f,"%d%d%d",&n,&a,&b);
fscanf(f,"%lld",&k);
fclose(f);
}

void scrie()
{
FILE *g=fopen("pavare2.out","w");
fprintf(g,"%lld\n",c[n][1]+c[n][0]);
int x=n,nr0=0,nr1=0,j;
if (k==1)
	{
	nr0=0;
	while (x)
		{
		if (nr0<=a) {fprintf(g,"0");nr0++;}
		else {fprintf(g,"1");nr0=0;}
		x--;
		}
	}
else
while (x)
	{
	if (c[x][0]>=k)
		{
		fprintf(g,"0");
		nr0++;
		nr1=0;
		}
	else
		{
		fprintf(g,"1");
		k-=c[x][0];
		nr0=0;
		nr1++;
		}
	x--;
	///trebuie recalculat c[x][ceva]
	if (nr0)
		{
		c[x][0]=0;
		for (j=1;j<=min(a-nr0,x);j++) c[x][0]+=c[x-j][1];
		}
	else
		{
		c[x][1]=0;
		for (j=1;j<=min(b-nr1,x);j++) c[x][1]+=c[x-j][0];
		}
	}
fprintf(g,"\n");
fcloseall();
}

int main()
{
citire();
calculeaza();
scrie();
return 0;
}