Cod sursa(job #89062)

Utilizator marius135Dumitran Adrian Marius marius135 Data 5 octombrie 2007 17:30:07
Problema Dame Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>

#define baza 1000000000
//#define baza 10
#define max 400

long v[32];
long t[10001][max+2];


void norm(long *a)
{
	for(long i=max;i >= a[0]-1;i--)
	{
		a[i]+=a[i+1]/baza;
		a[i+1]%=baza;
	}
	if(a[a[0]-1]) a[0]--;
	
}


void prod(long *a,long b,long *c)
{
	long i;
	for(i=a[0];i<=max;i++)
		c[i] = a[i] * b;
	c[0] = a[0];
	norm(c);
}

void add(long *a,long *b)
{
	for(long i=b[0]; i<= max;i++)
		a[i]+=b[i];
	a[0] = b[0];
	norm(a);
}
void scade(long *a,long *b)
{
	for(long i = max; i>= a[0];i--)
	{
		a[i]-=b[i];
		if(a[i]<0) {a[i]+=baza;	a[i-1]--;}
	}
	
	if(a[a[0]-1]==-1) {a[a[0]] =0;a[0]++;}
}
int main()
{
	freopen("dame.in","r",stdin);
	freopen("dame.out","w",stdout);
	long n,k,s=0,nr;
	scanf("%ld%ld",&n,&k);
	long i;
	/*while(v[0]==0)
	{
		for(i=n;i>=0;i--)
			if(v[i]==0) {v[i]= 1;break;}
			else v[i] = 0;
		long ok = 1,nr =0;
		for(i=1;i<=n;i++)
			if(v[i]==1) {nr++;if(nr==k+1) ok = 0;}
			else nr =0;
		s+=ok;
	}*/
	t[1][0] = max;
	t[1][max] = 2;
	for(i = 2;i<=k+1 && i <= n;i++)
		prod(t[i-1],2,t[i]);
	if(i!=n+1) 
	{
		t[--i][max]--;
		for(i=1;i<=k+1;i++)
			add(t[k+2],t[i]);
		for(i=k+3;i<=n;i++)
		{
			add(t[i],t[i-1]);
			add(t[i],t[i-1]);
			scade(t[i],t[i-k-2]);
		}
	}
	else if(k+1==n) t[n][max]--;
	//printf("%ld\n",t[n][0]);
	printf("%ld",t[n][t[n][0]]);
	for(i=t[n][0]+1;i<=max;i++)
		printf("%09ld",t[n][i]);
	
	
	
	
	return 0;
}