Pagini recente » Cod sursa (job #1766483) | Cod sursa (job #1778043) | Autentificare | Cod sursa (job #941753) | Cod sursa (job #1304744)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int MAX_N = 22;
const int MAX_K = 32;
const int MAX_S = 10100;
const long long MOD = 3210121;
long long d[MAX_S];
int v[MAX_N][MAX_K];
int ans;
int p[MAX_N][MAX_K];
int n, k, s;
long long put(long long a, int b) {
if(b == 0) {
return 1;
}
if(b & 1) {
return ((long long)a * put(a, b - 1)) % MOD;
}
long long x = put(a, b / 2);
return (x * x) % MOD;
}
void subm(int l, bool par) {
if(l == n) {
int sum = 0;
for(int i = 1; i <= k; i++) {
sum += p[l][i];
}
if(sum <= s) {
if(par) {
ans = (ans + d[s - sum]) % MOD;
}
else {
ans = (ans - d[s - sum] + MOD) % MOD;
}
}
return;
}
for(int i = 1; i <= k; i++) {
p[l + 1][i] = p[l][i];
}
subm(l + 1, par);
for(int i = 1; i <= k; i++) {
p[l + 1][i] = max(p[l + 1][i], v[l + 1][i]);
}
subm(l + 1, par ^ true);
}
int main() {
fin >> k >> s >> n;
d[0] = 1;
for(int i = 1; i <= s; i++) {
d[i] = ((long long)((d[i - 1] * (i + k - 1)) % MOD) * put(i, MOD - 2)) % MOD;
}
for(int i = 1; i <= s; i++) {
d[i] = (d[i] + d[i - 1]) % MOD;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= k; j++) {
fin >> v[i][j];
}
}
subm(0, true);
ans = (ans - k * s - 1 + MOD) % MOD;
fout << ans;
return 0;
}