Cod sursa(job #660477)

Utilizator crushackPopescu Silviu crushack Data 13 ianuarie 2012 00:04:55
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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 ];
}

int nr;
void bkt(int p,int *vec)
{
	if (p==N+1)
	{
		if (!nr) return;
		if (nr&1)
			Rez=(Rez+add(vec))%mod;
		else Rez=(Rez-add(vec)+mod)%mod;
		return;
	}
	bkt(p+1,vec);
	int vn[K+3];
	memset(vn,0,sizeof(vn));
	for (int i=1;i<=K;++i)
		vn[i]=max(vec[i],v[p][i]);
	++nr;
	bkt(p+1,vn);
	--nr;
}

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]+T[j-1])%mod;
	
	int vec[KMax];
	memset(vec,0,sizeof(vec));
	bkt(1,vec);
	
	freopen(OUT,"w",stdout);
	printf("%d\n",((T[S]-Rez+mod)%mod + mod- K*S -1)%mod);
	fclose(stdout);
	
	return 0;
}