Cod sursa(job #3145040)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 12 august 2023 11:14:24
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

void maxSelf(int &x, int y) {
	if(y > x) {
		x = y;
	}
}

const int MOD = 3210121;

void addSelf(int &x, int y) {
	x += y;
	if(x >= MOD) {
		x -= MOD;
	}
	if(x < 0) {
		x += MOD;
	}
}

int add(int x, int y) {
	addSelf(x, y);
	return x;
}

void multSelf(int &x, int y) {
	x = (long long) x * y % MOD;
}

int mult(int x, int y) {
	multSelf(x, y);
	return x;
}

int fact(int n) {
	static vector<int> data(1, 1);
	for(int i = data.size(); i <= n; i++) {
		data.emplace_back(mult(data[i - 1], i));
	}
	return data[n];
}

int inv(int n) {
	static vector<int> data(2, 1);
	for(int i = data.size(); i <= n; i++) {
		data.emplace_back(mult(data[MOD % i], MOD - MOD / i));
	}
	return data[n];
}

int ifact(int n) {
	static vector<int> data(2, 1);
	for(int i = data.size(); i <= n; i++) {
		data.emplace_back(mult(data[i - 1], inv(i)));
	}
	return data[n];
}

int comb(int n, int k) {
	return mult(fact(n), mult(ifact(k), ifact(n - k)));
}

int lsb(int mask) {
	return mask & (-mask);
}

int k, s, n, cnt;
int stk[21];
vector<vector<int>> v;

void bkt(int p, vector<int> r) {
	for(int i = stk[p - 1] + 1; i < n; i++) {
		stk[p] = i;
		vector<int> rr = r;
		for(int j = 0; j < k; j++) {
			maxSelf(rr[j], v[i][j]);
		}
		int sum = 0, good = 0;
		for(int j = 0; j < k; j++) if(rr[j]) {
			good += 1;
			sum += rr[j];
		}
		int desired = s - sum;
		if(desired < 0 || good < 2) {
			continue;
		}
		if(p & 1) {
			addSelf(cnt, -comb(desired + k, k));
		} else {
			addSelf(cnt, comb(desired + k, k));
		}
		bkt(p + 1, rr);
		stk[p] = -1;
	}
}

int main() {
	fin >> k >> s >> n;
	v = vector<vector<int>>(n, vector<int>(k));
	for(auto &row: v) {
		for(auto &it: row) {
			fin >> it;
		}
	}
	cnt = add(comb(s + k, k), -1 - k * s);
	memset(stk, -1, sizeof(stk));
	bkt(1, vector<int>(k, 0));
	fout << cnt << '\n';
	return 0;
}