Pagini recente » Cod sursa (job #44824) | Cod sursa (job #1976890) | Cod sursa (job #1221431) | Cod sursa (job #1687917) | Cod sursa (job #2897736)
#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;
}