Cod sursa(job #482020)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 2 septembrie 2010 13:33:16
Problema Cowfood Scor 76
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#define Nmax 22
#define Kmax 32
#define Smax 10002
#define Mod 3210121

int A[Nmax][Kmax],ex[Kmax][Smax],cp[Kmax][Smax],Max[Nmax][Kmax];
int N,K,S,rez,nr;

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

void back(int k){
	int j,sum;
	if( k>N ){
		
		for(j=1,sum=0;j<=K;++j)
			sum+=Max[N][j];
		sum=S-sum;
		
		if( (nr & 1)==0 )
			rez = (rez+cp[K][sum])%Mod;
		else rez = rez-cp[K][sum]>=0 ? rez-cp[K][sum] : rez-cp[K][sum]+Mod;
	}
	else{
		//0
		for(j=1;j<=K;++j) Max[k][j]=Max[k-1][j];
		back(k+1);
		//1
		nr++;
		for(j=1;j<=K;++j) Max[k][j]=Maxim(Max[k-1][j],A[k][j]);
		back(k+1);
		nr--;
	}
}

int main(){
	int i,j;
	freopen("cowfood.in","r",stdin);
	freopen("cowfood.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]);
	
	cp[1][0]=1;
	for(j=1;j<=S;++j) ex[1][j]=1, cp[1][j]=(cp[1][j-1]+1)%Mod;
	
	for(i=2;i<=K;++i){
		cp[i][0]=1;
		for(j=1;j<=S;++j){
			ex[i][j]=cp[i-1][j];
			cp[i][j]=(cp[i][j-1]+ex[i][j])%Mod;
		}
	}
	
	back(1);
	
	rez = rez-(S*K+1) >= 0 ? rez-(S*K+1) : rez-(S*K+1)+Mod;
	printf("%d\n",rez);
	fclose(stdin); fclose(stdout);
	return 0;
}