Cod sursa(job #483280)

Utilizator MirceaTanaseMircea Tanase MirceaTanase Data 7 septembrie 2010 20:07:23
Problema Cowfood Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <algorithm>
#include <stdio.h>

#define restRez 3210121

using namespace std;

int k, s, n;
int sol;
int cant[32][32];
int sf[32];
int sum[32][10024];

inline int maxim(int x, int y)
{
	if (x > y)
		return x;
	return y;
}

inline void back(int level, int semn, int *act)
{
	if (level == n)
	{
		int sa = s;
		for (int i = 1; i <= k; i++)
			sa -= act[i];

		if (sa >= 0)
			sol = (sol + semn * sf[sa]) % restRez;
		return;
	}
	
	int past[32];
	for (int i = 1; i <= k; i++)
		past[i] = act[i];
	back(level + 1, semn, past);

	for (int i = 1; i <= k; i++)
		act[i] = maxim(act[i], cant[level][i]);
	back(level + 1, semn * (-1), act);
}

int main()
{
	freopen("cowfood.in", "r", stdin);
	freopen("cowfood.out", "w", stdout);
	
	scanf("%d %d %d", &k, &s, &n);

	for (int i = 0; i < n; i++)
		for (int j = 1; j <= k; j++)
			scanf("%d", &cant[i][j]);

	sum[0][0] = 1;
	for (int i = 1; i <= k; i++)
		for (int j = 0, sumP = 0; j <= s; j++)
		{
			sumP = (sumP + sum[i - 1][j]) % restRez;

			sum[i][j] = sumP;
		}

	sf[0] = sum[k][0];
	for (int i = 1; i <= s; i++)
		sf[i] = (sf[i - 1] + sum[k][i]) % restRez;	

	sol = restRez - (k * s + 1) % restRez;

	int act[32];
	memset(act, 0, sizeof(act));
	back(0, 1, act);

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

	fclose(stdin);
	fclose(stdout);
	return 0;
}