Cod sursa(job #191884)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 29 mai 2008 14:49:33
Problema Cowfood Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <string>

#define maxn 35
#define maxx 10010
#define mod 3210121
#define max(a,b) (a > b ? a : b)

int n, m, s, sol;
int a[maxn][maxn];
int c[maxx], d[maxx];
int v[maxn];

int main()
{
	freopen("cowfood.in", "r", stdin);
	freopen("cowfood.out", "w", stdout);

	scanf("%d %d %d ", &n, &s, &m);

	int i, j, k, S, semn;

	for (i=1; i<=n; i++)
		for (j=1; j<=m; j++) scanf("%d ", &a[i][j]);
	
	c[0] = 1;

	for (i=0; i<m; i++)
	{
		memcpy(d, c, sizeof(c));
		memset(c, 0, sizeof(c));

		for (j=0; j<=s; j++) 
		{
			c[j] = c[j-1] + d[j];
			if (c[j] >= mod) c[j] -= mod;
		}
	}

	for (i=1; i<=s; i++) 
	{
		c[i] += c[i-1];
		if (c[i] >= mod) c[i] -= mod;
	}

	for (i=0; i<1<<n; i++) 
	{
		semn = 1;

		for (k=1; k<=m; k++) v[k] = 1;

		for (j=0; j<n; j++) 
			if (i&(1<<j)) 
			{
				semn *= -1;
				for (k=1; k<=m; k++) v[k] = max(v[k], a[j+1][k]);
			}
		
		S = s;
		for (j=1; j<=m; j++) S -= v[j];

		if (S > 0) 
		{
			sol += semn*c[S];

			if (sol < 0) sol += mod;
			if (sol >= mod) sol -= mod;
		}
	}

	printf("%d\n", sol);

	return 0;
}