Cod sursa(job #627460)

Utilizator indestructiblecont de teste indestructible Data 30 octombrie 2011 00:05:51
Problema Cowfood Scor 44
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.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,C[HMAX][KMAX],nbiti[HMAX];
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 solve()
{
	int i,j,t,stare,sum;//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;
	
	for (i=1; i<(1<<n); i++)
	{
		for (j=1; j<=n; j++)
			if (i & 1<<(j-1))
			{
				stare=i ^ (1<<(j-1));
				for (t=1; t<=k; t++)
					C[i][t]=max(C[stare][t],A[j][t]);
				break ;
			}
		sum=0;
		for (j=1; j<=k; j++)
			sum+=C[i][j];
		nbiti[i]=nbiti[i>>1]+(i & 1);
		if (nbiti[i] & 1)
		{
			rez-=S[k][s-sum];
			if (rez<0)
				rez+=MOD;
		}
		else
		{
			rez+=S[k][s-sum];
			if (rez>MOD)
				rez-=MOD;
		}
	}
}
int main()
{
	freopen("cowfood.in","r",stdin);
	freopen("cowfood.out","w",stdout);
	read();
	precompute();
	solve();
	printf("%d\n",rez);
	return 0;
}