Cod sursa(job #831714)

Utilizator elfusFlorin Chirica elfus Data 9 decembrie 2012 00:12:40
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.25 kb
#include <stdio.h>
#define MOD 3210121

int N, K, S, x[25][35], dp[35][10100], st[25], food[35], sol = 0;

void back(int lev)
{
	int i, j;
	int lastFood[35];

	for (i = st[lev - 1] + 1; i <= N; i ++)
	{
		st[lev] = i;
		for (j = 1; j <= K; j ++)
		{
			lastFood[j] = food[j];
			if (x[i][j] > food[j])
				food[j] = x[i][j];
		}
		
		int ret = S;
		for (j = 1; j <= K; j ++)
			ret = ret - food[j];
		sol += dp[K][ret];
		if (lev % 2 == 0)
		{
			sol = sol - 2 * dp[K][ret];
			while (sol < 0)
				sol += MOD;
		}
		while (sol >= MOD)
			sol = sol - MOD;
		
		back(lev + 1);
		for (j = 1; j <= K; j ++)
			food[j] = lastFood[j];
	}
}

int main()
{
	int i, j;
	
	freopen("cowfood.in", "r", stdin);
	freopen("cowfood.out", "w", stdout);
	
	scanf("%d%d%d", &K, &S, &N);
	for (i = 1; i <= N; i ++)
		for (j = 1; j <= K; j ++)
			scanf("%d", &x[i][j]);
	
	for (i = 0; i <= K; i ++)
		for (j = 0; j <= S; j ++)
		{
			if (i == 0)
			{
				dp[i][j] = 1;
				continue;
			}
			dp[i][j] = dp[i - 1][j];
			if (j)
				dp[i][j] += dp[i][j - 1];
			if (dp[i][j] >= MOD)
				dp[i][j] = dp[i][j] - MOD;
		}
		
	back(1);
	sol = dp[K][S - K] - sol;
	while (sol < 0)
		sol = sol + MOD;
	
	printf("%d", sol);
	return 0;
}