Cod sursa(job #40004)

Utilizator MariusMarius Stroe Marius Data 27 martie 2007 10:35:51
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <cstdio>
using namespace std;

const char iname[] = "cowfood.in";
const char oname[] = "cowfood.out";

#define MAX_N  27
#define MAX_K  37
#define MAX_S  10007
#define modulo 3210121

int K, S, N;

int A[MAX_N][MAX_K];

int num[MAX_K + 1][MAX_S + 1];


void read_in(int A[][MAX_K], int *K, int *S, int *N)
{
	scanf("%d %d", K, S);
	int i;
	int j;
	for (scanf("%d", N), i = 0; i < *N; ++ i)
		for (j = 0; j < *K; ++ j)
			scanf("%d", A[i] + j);
}

void count(int num[][MAX_S + 1], int K, int S)
{
	for (int j = 0; j <= S; ++ j)
		num[1][j] = 1;
	for (int i = 2; i <= K; ++ i) {
		num[i][0] = 1;
		for (int j = 1; j <= S; ++ j)
			num[i][j] = (num[i][j - 1] + num[i - 1][j]) % modulo;
	}
	for (int i = 1; i <= K; ++ i)
		for (int j = 1; j <= S; ++ j)
			num[i][j] = (num[i][j] + num[i][j - 1]) % modulo;
}

int X[MAX_K], Res = 0;

void f(int i, int sgn) 
{
	if (i < N) {
		f(i + 1, sgn);
		int T[MAX_K];
		for (int j = 0; j < K; ++ j) {
			T[j] = X[j];
			if (X[j] < A[i][j])	  
				X[j] = A[i][j];
		}
		f(i + 1, sgn == +1 ? -1 : +1);
		
		for (int j = 0; j < K; ++ j)
			X[j] = T[j];
	} else if (i == N) {
		int sum = 0;
		int cnt = 0;
		for (int j = 0; j < K; ++ j) {
			if (X[j] > 0)
				cnt ++, sum = sum + X[j];
		}
		if (S < sum)  return ;

		if (cnt == 0)
			Res = Res + sgn * (num[K][S] - 1 - K * S);
        else if (cnt == 1)
			Res = Res + sgn * (num[K][S - sum] - (S - sum + 1));
		else if (cnt > 1)
			Res = Res + sgn * num[K][S - sum];

		Res = Res % modulo;
	}
}

int main(void)
{
	freopen(iname, "r", stdin);
	read_in(A, &K, &S, &N);
	count(num, K, S);
	f(0, 1);
	if (Res <  0)
		Res += modulo;
	freopen(oname, "w", stdout);
	printf("%d\n", Res);
	return 0;
}