Cod sursa(job #21850)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 24 februarie 2007 18:41:43
Problema Cowfood Scor 14
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>

#define MAXK 31
#define MAXN 21
#define MAXS 10001
#define MOD 3210121

int K, S, N, NR;
int x[MAXK][MAXK];
int nr[MAXK][MAXS];

int st[MAXN], sts[MAXN][MAXK];

inline int max( int a, int b )
{
	return a > b ? a : b;
}

void back(int k, int Nr, int type)
{
	int i, j;
	if (k == Nr)
	{
		int Sst = 0;
		for (i = 0; i < K; i++)
			Sst += sts[k][i];

		if (Sst > S)
			return;

		NR += type * nr[K][S - Sst];
		if (NR >= MOD)
			NR -= MOD;
		return;
	}

	for (i = k ? (st[k - 1] + 1) : 0; i < N; i++)
	{
		for (j = 0; j < K; j++)
			sts[k + 1][j] = max( sts[k][j], x[i][j] );
		st[k] = i;

		back(k + 1, Nr, type);
	}
}

int main()
{
	freopen("cowfood.in", "rt", stdin);
	freopen("cowfood.out", "wt", stdout);

	scanf("%d %d %d", &K, &S, &N);
	int i, j;
	for (i = 0; i < N; i++)
		for (j = 0; j < K; j++)
			scanf("%d", x[i] + j);

	if (S < K)
	{
		printf("0\n");
		return 0;
	}

	//nr[i][j] = nr de posibilitati de a adauga cel mult j unitati la i intregi

	for (i = 0; i <= S; i++)
		nr[1][i] = i + 1;

	for (i = 2; i <= K; i++)
		for (nr[i][0] = j = 1; j <= S; j++)
		{
			nr[i][j] = nr[i - 1][j] + nr[i][j - 1];
			if (nr[i][j] >= MOD)
				nr[i][j] -= MOD;
		}

	NR = nr[K][S - K];
	for (i = 1; i <= K; i++)
		if (i & 1)
			back(0, i, -1);
		else
			back(0, i, 1);

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

	return 0;
}