Cod sursa(job #166173)

Utilizator scvalexAlexandru Scvortov scvalex Data 27 martie 2008 16:43:06
Problema Cowfood Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <iostream>

using namespace std;

#define MOD 3210121

int K, S, N;
int Sum[10002][22];
int a[22][32],
	v[22][32];
int sol;

#define MAX(a, b) ((a>b) ? (a) : (b))

void solve(int nv, int sgn, int num) {
	for (int i = nv; i <= N; ++i) {
		int sum(0);
		for (int j(1); j <= K; ++j) {
			v[num+1][j] = MAX(v[num][j], a[i][j]);
			sum += v[num+1][j];
		}
		if (S-sum >= 0)
			sol = (sol + Sum[S-sum][K]*sgn + MOD) % MOD;
		solve(i+1, -1*sgn, num+1);
	}
}

int main(int argc, char *argv[]) {
	FILE *fi = fopen("cowfood.in", "r");
	fscanf(fi, "%d %d %d", &K, &S, &N);
	for (int i(1); i <= N; ++i)
		for (int j(1); j <= K; ++j)
			fscanf(fi, "%d", a[i]+j);
	fclose(fi);

	Sum[0][0] = 1;

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

	for (int j(1); j <= K; ++j) 
		for (int i(1); i <= S; ++i) 
			Sum[i][j] = (Sum[i - 1][j] + Sum[i][j - 1]) % MOD;

	for (int i(2); i <= S; ++i)
		sol = (sol + Sum[i][K - 1] - K + MOD) % MOD;

	solve(1, -1, 0);

	FILE *fo = fopen("cowfood.out", "w");
	fprintf(fo, "%d\n", sol);
	fclose(fo);

	return 0;
}