Pagini recente » Cod sursa (job #2703815) | Cod sursa (job #1882096) | Cod sursa (job #1348280) | Cod sursa (job #2544482) | Cod sursa (job #2988768)
#include <bits/stdc++.h>
#define MOD 3210121
#define N 25
#define K 35
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int k, s, n;
int v[N][K], w[K], inv_fact[K];
inline void clear_w(){
for (int i = 1; i <= k; i++)
w[i] = 0;
}
int qexp(int a, int b){
int r = 1;
while (b){
if (b % 2 == 1)
r = (1LL * r * a) % MOD;
a = (1LL * a * a) % MOD;
b /= 2;
}
return r;
}
void calc_inv_fact(){
int p = 1;
for (int i = 2; i <= k; i++)
p = (1LL * i) % MOD;
inv_fact[k] = qexp(p, MOD - 2);
for (int i = k - 1; i >= 0; i--)
inv_fact[i] = (1LL * inv_fact[i + 1] * (i + 1)) % MOD;
}
int main(){
fin >> k >> s >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= k; j++)
fin >> v[i][j];
calc_inv_fact();
long long ans = 0;
for (int mask = 1; mask < (1 << n); mask++){
clear_w();
int cnt = 0;
for (int bit = 0; bit < n; bit++){
if ((1 << bit) & mask){
for (int i = 1; i <= k; i++)
w[i] = max(w[i], v[bit + 1][i]);
cnt++;
}
}
int sum = s;
for (int i = 1; i <= k; i++)
sum -= w[i];
int x = inv_fact[k];
for (int i = sum + 1; i <= sum + k; i++)
x = (1LL * x * i) % MOD;
ans = (ans + MOD + 1LL * (cnt % 2 * 2 - 1) * x) % MOD;
}
int x = inv_fact[k];
for (int i = s - k + 1; i <= s; i++)
x = (1LL * x * i) % MOD;
ans = (x + MOD - ans) % MOD;
fout << ans << "\n";
return 0;
}