Cod sursa(job #171175)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 3 aprilie 2008 19:47:41
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#define MAX(a,b)((a)>(b)?(a):(b))
#define MIN(a,b)((a)<(b)?(a):(b))
#define M 3210121
#define mod(a)(((a)>=M)?((a)-M):(a))
int a[10100][25],S,n,K,s,Sum[10100][25],E[25][35],v[25][35];
void solv(int x,int y,int z){
	int i,j,sum;
		for(i=x;i<=n;i++){
			sum=0;
			for(j=1;j<=K;j++){
				v[z+1][j]=MAX(v[z][j],E[i][j]);
				sum+=v[z+1][j];
			}
			if (S-sum >=0){
				s=mod(s+Sum[S-sum][K]*y+M);
				while(s>=M)
					s=mod(s);
			}
			solv(i+1,-1*y,z+1);
		}
}
int main(){
	int i,j;
	freopen("cowfood.in","r",stdin);
	freopen("cowfood.out","w",stdout);
	scanf("%d%d%d",&K,&S,&n);
	a[0][0]=Sum[0][0]=1;
	for(i=1;i<=S;i++)
		Sum[i][0]=1;
	for(j=1;j<=K;j++){
		a[0][j]=Sum[0][j]=1;
		for(i=1;i<=S;i++)
			a[i][j]=Sum[i][j-1],
			Sum[i][j]=(Sum[i-1][j]+a[i][j])%M;
	}
	for(i=1;i<=n;i++)
			for(j=1;j<=K;j++)
				scanf("%d",E[i]+j);
	s=0;
    for(i=2;i<=S;i++){
		s=mod(s+a[i][K]-K+M);
		while(s>=M)
			s=mod(s);
	}
	solv(1,-1,0);
	printf("%d\n",s);
	fclose(stdin);
	fclose(stdout);
	return 0;
}