Cod sursa(job #343480)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 25 august 2009 23:25:26
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.43 kb
#include <cstdio>
#include <cstring>

#define file_in "cowfood.in"
#define file_out "cowfood.out"

#define Nmax 25
#define Kmax 35
#define Smax 10005
#define Mod 3210121


int i,j,K,S,N,a[Nmax][Kmax];
int m[Nmax][Smax];
int f[Kmax],rez;

inline int maxim(int a, int b) { return a>b?a:b; }

void back(int k)
{
	int faux[Kmax],j,smax=S;
	
	if (k==N+1)
	{
		for (j=1;j<=K;++j)
			 smax-=f[i];
		if (smax<0)
		{
			return ;
		}
		
		if (i%2==0)
		{
			rez+=m[K][smax];
			if (rez>=Mod)
				rez-=Mod;
		}
		else
		{
			rez-=m[K][smax];
			if (rez<0)
				rez+=Mod;
		}
		
		return ;
	}
	
	else
	{
		back(k+1);
		i++;
		memcpy(faux,f,sizeof(f));
		for (j=1;j<=K;++j)
			 f[j]=maxim(f[j],a[k][j]);
		back(k+1);
		i--;
		memcpy(f,faux,sizeof(f));
	}
}
		

int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	
	scanf("%d %d %d", &K,&S,&N);
	for (i=1;i<=N;++i) 
		 for (j=1;j<=K;++j)
			   scanf("%d", &a[i][j]);
		 
	
	

	for (i=0;i<=K;++i)
         m[i][0]=1;
	for (j=0;j<=S;++j)
		 m[0][j]=1;
	
	for (i=1;i<=K;++i)
		 for (j=1;j<=S;++j)
		 {
			 m[i][j]=m[i-1][j]+m[i][j-1];
			 if (m[i][j]>=Mod)
				 m[i][j]-=Mod;
		 }
	

/*	for (i=1;i<=K;++i)
    {
		for (j=1;j<=S;++j)
			 printf("%d ", m[i][j]);
		printf("\n");
	}*/
	
	back(1);
	rez-=(K*S-1);
	
	rez=(rez+Mod)%Mod;
	
	printf("%d", rez);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}