Cod sursa(job #660350)

Utilizator crushackPopescu Silviu crushack Data 12 ianuarie 2012 16:08:26
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.12 kb
#include <stdio.h>
#include <string.h>
#define NMax 32
#define KMax 32
#define SMax 10010

const char IN[]="cowfood.in",OUT[]="cowfood.out";
const int mod = 3210121;

int N,S,K,Rez;
int v[NMax][KMax];
int aux[NMax];
int T[SMax];

inline int max(int x,int y){
	return x>y ? x : y;
}

inline int add(int *st)
{
	int s=0;
	for (int i=1;i<=K;++i) s+=st[i];
	if ( s>S ) return 0;
	return T[ S - s ];
}

void bkt()
{
	int i,j,k,nrbits;
	
	for (i=1;i<(1<<N);++i)
	{
		memset(aux,0,sizeof(aux));nrbits=0;
		for (j=0;j<N;++j) if ( i&(1<<j) )
			for (k=1,nrbits^=1;k<=K;++k)
				aux[k]=max(v[j+1][k],aux[k]);
		if (nrbits)
			Rez+=add(aux);
		else
			Rez+=-add(aux)+mod;
		while (Rez>=mod) Rez-=mod;
	}
}

int main()
{
	int i,j;
	freopen(IN,"r",stdin);
	scanf("%d%d%d",&K,&S,&N);
	for (i=1;i<=N;++i)
		for (j=1;j<=K;++j)
			scanf("%d",&v[i][j]);
	fclose(stdin);
	
	for ( i=0;i<=S;++i) T[i]=1;
	for ( i=1;i<=K;++i)
		for (j=1;j<=S;++j)
			T[j]+=T[j-1],
			(T[j]>=mod) ? T[j]-=mod : 0;
	
	bkt();
	
	freopen(OUT,"w",stdout);
	printf("%d\n",(T[S]-Rez+mod)%mod);
	fclose(stdout);
	
	return 0;
}