Cod sursa(job #192156)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 31 mai 2008 08:53:00
Problema Cowfood Scor 86
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <string>

#define maxn 35
#define maxs 10010
#define maxx 1048576
#define us unsigned short
#define max(a,b) (a > b ? a : b)
#define mod 3210121

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

void back(int k)
{
	if (k == n)
	{
		int S = s, i;

		for (i=1; i<=m; i++) S -= v[i];
		if (S < 0) return;

		sol += c[S] * semn;
		if (sol > mod) sol -= mod;
		if (sol < 0) sol += mod;
	}
	else {
		     back(k+1);

			 int aux[maxn], i, S = s;
			 memcpy(aux, v, sizeof(v));

			 for (i=0; i<=m; i++)
			 {
				 if (a[k][i] > v[i]) v[i] = a[k][i];
				 S -= v[i];
			 }

			 semn = -semn;

			 if (S > 0) back(k+1);

			 semn = -semn;
			 memcpy(v, aux, sizeof(aux));
		 }
}

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

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

	int i, j;

	for (i=0; 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));

		c[0] = 1;

		for (j=1; j<=s; j++) 
		{
			c[j] = d[j] + c[j-1];
			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;
	}

	semn = 1;
	back(0);

	sol = (sol - m*s - 1) % mod;
	if (sol < 0) sol += mod;

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

	return 0;
}