Cod sursa(job #2897736)

Utilizator livliviLivia Magureanu livlivi Data 4 mai 2022 18:23:28
Problema Cowfood Scor 12
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cassert>
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("cowfood.in");
ofstream cout("cowfood.out");

const int mod = 3210121;

vector<vector<int>> v;
int ans = 0, k, n, s;

vector<int> fact;
vector<int> inv_mod;

int pow(int a, int p) {
	int ans = 1;
	while (p > 0) {
		if (p & 1) {
			ans = (1LL * ans * a) % mod;
		}
		a = (1LL * a * a) % mod;
		p /= 2;
	}
	return ans;
}

void init(int lim) {
	fact.resize(lim);
	inv_mod.resize(lim);

	fact[0] = 1;
	for (int i = 1; i < lim; i++) {
		fact[i] = (fact[i - 1] * i) % mod;
		inv_mod[i] = pow(fact[i], mod - 2);
	}
}

int C(int n, int k) {
	// cerr << "  " << n << " " << k << endl;
	return (1LL * fact[n] * inv_mod[n - k] * inv_mod[k]) % mod;
}

void bkt(int last, int cnt, vector<int>& comb) {
	if (last == n) {
		int sum = s;
		for (int i = 0; i < k; i++) {
			sum -= comb[i];
		}

		if (sum < 0) { return; } 
		int to_add = C(sum + k, k);
		ans = (ans + (1 - 2 * (cnt & 1)) * to_add) % mod;
		// cerr << sum << " " << cnt << "\n";
		// cerr << sum + k << " " << k << " " << to_add << " " << ans << endl;
		return;
	}

	bkt(last + 1, cnt, comb);

	vector<int> aux(comb);
	for (int i = 0; i < k; i++) {
		comb[i] = max(comb[i], v[last][i]);
	}
	bkt(last + 1, cnt + 1, comb);
	comb = aux;
}

int main() {
	cin >> k >> s >> n;
	v.resize(n, vector<int>(k));

	init(s + k + 1);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < k; j++) {
			cin >> v[i][j];
		}
	}

	vector<int> comb(k);
	bkt(0, 0, comb);

	ans = (ans - s * k - 1) % mod;
	cout << ans << "\n";
	return 0;
}