Cod sursa(job #627462)

Utilizator indestructiblecont de teste indestructible Data 30 octombrie 2011 00:15:34
Problema Cowfood Scor 52
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 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],B[KMAX][LMAX],S[KMAX][LMAX],rez,cfg[KMAX];
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++)
		B[1][i]=1,S[1][i]=i+1;
	for (i=2; i<=k; i++)
		for (j=0; j<=s; j++)
		{
			B[i][j]=S[i-1][j];
			S[i][j]=(S[i][j-1]+B[i][j])%MOD;
		}
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void update()
{
	memset(cfg,0,sizeof(cfg));
	int i,j,sum,nbiti=0;
	for (i=1; i<=n; i++)
		if (marc[i])
		{
			nbiti++;
			for (j=1; j<=k; j++)
				cfg[j]=max(cfg[j],A[i][j]);
		}
	sum=0;
	for (j=1; j<=k; j++)
		sum+=cfg[j];
	if (nbiti==0)
		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);
	marc[poz]=1;
	back(poz+1);
}
void solve()
{
	//incerc sa obtin toate posibilitatile valide
	rez=S[k][s]; //le pun oricum pe alea k
	rez-=(k*s+1)%MOD; //scad cand doar 1 sg valoare e pozitiva sau niciuna
	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;
}