Cod sursa(job #344666)

Utilizator CezarMocanCezar Mocan CezarMocan Data 31 august 2009 12:01:45
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#define maxk 32
#define maxn 21
#define maxs 10100
#define mod 3210121

using namespace std;

int k, s, n, nrb, sol;
int i, j;
int v[maxn][maxk];
int a[maxk][maxs], sum[maxk][maxs];
int f[maxn][maxk], st[maxn];

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

void back(int q) {
	int i, j, sp, val;
	if (q == n) {
		sp = 0;
		for (i = 1; i <= k; i++) 
			sp += f[n][i];

		if (sp <= s) {
			if (nrb % 2 == 1)
				sol = sol - sum[k][s - sp];
			else
				sol = (sol + sum[k][s - sp]) % mod;
			if (sol < 0)
				sol += mod;
		}
	}
	else {
		for (i = 0; i < 2; i++) {
			st[q + 1] = i;
			for (j = 1; j <= k; j++)
				f[q + 1][j] = max(f[q][j], v[q + 1][j] * i);
			nrb += i;
			back(q + 1);
			nrb -= i;
		}
	}
}

int main() {
	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", &v[i][j]);

	a[1][0] = sum[1][0] = 1;
	for (i = 1; i <= s; i++) {
		a[1][i] = 1;
		sum[1][i] = (sum[1][i - 1] + 1) % mod;
	}

	for (i = 2; i <= k; i++) {
		a[i][0] = sum[i][0] = 1;
		for (j = 1; j <= s; j++) {
			a[i][j] = sum[i - 1][j];
			sum[i][j] = (sum[i][j - 1] + a[i][j]) % mod;
		}
	}

	back(0);
	sol = sol - (k * s + 1); //le scad pe cele care sunt cu 0
	if (sol < 0)
		sol += mod;
	
	printf("%d\n", sol);

	return 0;
}