Pagini recente » Cod sursa (job #3272493) | Cod sursa (job #3145099) | Cod sursa (job #3125635) | Cod sursa (job #332915) | Cod sursa (job #3299900)
#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 fact[MAX + 2];
long long k, s, n, i, j;
long long a[102][102];
long long v[102];
long long rasp;
static inline long long Put(long long a, long long n = MOD - 2) {
long long p = 1;
while(n) {
if(n & 1) p = (p * a) % MOD;
a = (a * a) % MOD;
n >>= 1;
}
return p;
}
static inline void PrecalcFact() {
fact[0] = 1;
for(i = 1; i <= s; i++) fact[i] = (fact[i - 1] * i) % MOD;
}
static inline long long Comb(long long n, long long k) {
return fact[n] * Put(fact[k] * fact[n - k] % MOD) % 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 = Comb(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;
PrecalcFact();
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;
}