Pagini recente » Cod sursa (job #987658) | Cod sursa (job #38548) | Cod sursa (job #393957) | Cod sursa (job #2728802) | Cod sursa (job #3223318)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int64_t mod = 3'210'121, kmax = 30, nmax = 20, smax = 10'000;
vector<int64_t> fail[nmax + 1], fact(smax + kmax + nmax + 1), inv(mod);
int64_t n, k, s, x, rez = 0;
void read() {
fin >> k >> s >> n;
for(int64_t i = 0; i < n; i++) {
for(int64_t j = 0; j < k; j++) {
fin >> x;
fail[i].push_back(x);
}
}
}
int64_t lgput(int64_t x, int64_t a) {
int64_t prod = 1;
while(a) {
if(a % 2 == 1)
prod = (prod * x) % mod;
x = (x * x) % mod;
a /= 2;
}
return prod % mod;
}
void make_fact() {
int64_t N = smax + kmax + nmax;
fact[0] = 1;
for(int64_t i = 1; i <= N; i++)
fact[i] = (fact[i - 1] * i) % mod;
N = mod - 1;
for(int64_t i = N; i >= 1; i--)
inv[i] = lgput(i, mod - 2);
}
int64_t comb(int64_t n, int64_t k) {
if(k > n || n < 0)
return 0;
int64_t sus = fact[n];
int64_t jos = (fact[k] * fact[n - k]) % mod;
return (sus * inv[jos]) % mod;
}
int64_t sc(int64_t masca) {
vector<int64_t> rez(k, 0);
int64_t cate = 0;
for(int64_t i = 0; i < n; i++) {
if((1 << i)&masca) {
cate++;
for(int64_t j = 0; j < k; j++)
rez[j] = max(rez[j], fail[i][j]);
}
}
int64_t sum = 0, semn = ((cate % 2 == 1) ? (-1) : (1));
for(int64_t i = 0; i < k; i++)
sum += rez[i];
return semn * comb(s - sum + k, k);
}
void solve() {
rez = comb(s, k);
for(int64_t mask = 1; mask < (1 << n); mask++)
rez = (rez + sc(mask) + mod) % mod;
}
signed main() {
read();
make_fact();
solve();
fout << rez;
return 0;
}