Cod sursa(job #627470)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 30 octombrie 2011 00:41:22
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <string.h>
#define NMAX 21
#define KMAX 31
#define LMAX 10005
#define HMAX (1<<20)
#define MOD 3210121
#define ll long long
int k,s,n,A[NMAX][KMAX],S[KMAX][LMAX],rez,cfg[KMAX],nbiti,sum;
char marc[NMAX];
void read()
{
	scanf("%d%d%d",&k,&s,&n);
	int i,j;
	for (i=1; i<=n; i++)
		for (j=1; j<=k; j++)
			scanf("%d",&A[i][j]);
}
void precompute()
{
	int i,j;
	for (i=0; i<=s; i++)
		S[1][i]=i+1;
	for (i=2; i<=k; i++)
		for (j=0; j<=s; j++)
			S[i][j]=(S[i][j-1]+S[i-1][j])%MOD;
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void update()
{
	if (nbiti==0)
		return ;
	if (sum>s)
		return ;
	
	if (nbiti & 1)
	{
		rez-=S[k][s-sum];
		if (rez<0)
			rez+=MOD;
	}
	else
	{
		rez+=S[k][s-sum];
		if (rez>MOD)
			rez-=MOD;
	}
}
void back(int poz)
{
	if (poz==n+1)
	{
		update();
		return ;
	}
	marc[poz]=0;
	back(poz+1);
	
	int i,cfg2[KMAX];
	for (i=1; i<=k; i++)
	{
		cfg2[i]=cfg[i];
		sum-=cfg[i];
		cfg[i]=max(cfg[i],A[poz][i]);
		sum+=cfg[i];
	}
	nbiti++;
	marc[poz]=1;
	back(poz+1);
	for (i=1; i<=k; i++)
	{
		sum-=cfg[i];
		cfg[i]=cfg2[i];
		sum+=cfg[i];
	}
	nbiti--;
}
void solve()
{
	rez=S[k][s]; 
	rez-=(k*s+1)%MOD; 
	if (rez<0)
		rez+=MOD;
	
	back(1);
}
int main()
{
	freopen("cowfood.in","r",stdin);
	freopen("cowfood.out","w",stdout);
	read();
	precompute();
	solve();
	printf("%d\n",rez);
	return 0;
}