Pagini recente » Cod sursa (job #3292704) | Cod sursa (job #3187704) | Cod sursa (job #3216801) | Cod sursa (job #3296903) | Cod sursa (job #3299903)
#include <bits/stdc++.h>
using namespace std;
#define STDIO 0
#if STDIO
#define fin cin
#define fout cout
#else
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
#endif // STDIO
const long long MOD = 3210121;
const long long MAX = 10000;
long long cmb[32][MAX + 2];
long long k, s, n, i, j;
long long a[102][102];
long long v[102];
long long rasp;
static inline void Precalc() {
for(i = 0; i <= s; i++) cmb[0][i] = 1;
for(i = 1; i <= k; i++) {
cmb[i][0] = 1;
for(j = 1; j <= s; j++) {
cmb[i][j] = (cmb[i - 1][j] + cmb[i][j - 1]) % MOD;
}
}
}
static inline void Recur(long long poz = 1, long long sel = 0) {
if(poz == n + 1) {
long long sum = 0, com;
for(long long i = 1; i <= k; i++) sum += v[i];
if(sum > s) return;
com = cmb[k][s - sum];
if(sel % 2 == 1) com = -com;
rasp = (rasp + com + MOD) % MOD;
}
else {
Recur(poz + 1, sel);
vector<long long> cop(k + 1);
for(long long i = 1; i <= k; i++) {
cop[i] = v[i];
v[i] = max(v[i], a[poz][i]);
}
Recur(poz + 1, sel + 1);
for(long long i = 1; i <= k; i++) v[i] = cop[i];
}
}
int main() {
fin >> k >> s >> n;
Precalc();
for(i = 1; i <= n; i++) {
for(j = 1; j <= k; j++) {
fin >> a[i][j];
}
}
Recur();
fout << (rasp - 1 - s * k + MOD) % MOD;
return 0;
}