Cod sursa(job #483273)

Utilizator MirceaTanaseMircea Tanase MirceaTanase Data 7 septembrie 2010 19:45:20
Problema Cowfood Scor 36
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <algorithm>
#include <stdio.h>

#define restRez 3210121
#define ll long long

using namespace std;

int k, s, n;
ll 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;
}

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++)
	{
		int sumP = 0;
		for (int j = 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];	

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

	for (int i = 0; i < (1 << n); i++)
	{
		ll semn = 1;
		int act[32];
		memset(act, 0, sizeof(act));

		for (int j = 0; j < n; j++)
			if (i & (1 << j))
			{
				semn *= (ll) -1;
				
				for (int h = 1; h <= k; h++)
					act[h] = maxim(act[h], cant[j][h]);
			}

		int sa = s;
		for (int j = 1; j <= k; j++)
			sa -= act[j];

		if (sa >= 0)
			sol = (sol + semn * sf[sa]) % restRez;
	}

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

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