Pagini recente » Cod sursa (job #2958832) | Cod sursa (job #1532341) | Cod sursa (job #1831156) | Cod sursa (job #570032) | Cod sursa (job #1658170)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 21, K = 31, S = 10032, MOD = 3210121;
int a [N][K], total = 0, A [K], lim, sp [S];
int dp [S][K];
void preg (int n, int k) {
int i, j;
dp [0][0] = 1;
for (i = 1; i <= n; i ++) {
dp [i][0] = 1;
// printf ("%d ", dp [i][0]);
for (j = 1; j <= k; j ++) {
dp [i][j] = dp [i - 1][j] + dp [i - 1][j - 1];
// printf ("%d ", dp [i][j]);
if (dp [i][j] >= MOD)
dp [i][j] -= MOD;
}
// printf ("\n");
}
for (i = k + 1; i <= n; i ++) {
dp [i][k - 1] = dp [i][k - 1] + dp [i - 1][k - 1];
if (dp [i][k - 1] >= MOD)
dp [i][k - 1] -= MOD;
}
}
void add (int k) {
int i;
for (i = 1; i <= lim; i ++)
A [i] = max (A [i], a [k][i]);
}
int main () {
int n, k, s, i, ns, sum, S, num, ans, j, v, b;
freopen ("cowfood.in", "r", stdin);
freopen ("cowfood.out", "w", stdout);
scanf ("%d%d%d", &k, &s, &n);
for (i = 1; i <= n; i ++)
for (j = 1; j <= k; j ++)
scanf ("%d", &a [i][j]);
preg (s + k - 1, k);
total = dp [s + k - 1][k - 1] - k * s;
while (total < 0)
total += MOD;
ns = (1 << n) - 1;
lim = k;
for (v = 1; v <= ns; v ++) {
num = 0;
memset (A, 0, sizeof (A));
for (b = 0; b < n; b ++)
if (v & (1 << b)) {
add (b + 1);
num ++;
}
sum = 0;
for (b = 1; b <= k; b ++)
sum += A [b];
S = s - sum;
if (S < 0)
continue;
ans = 0;
ans = dp [S + k - 1][k - 1];
if (num % 2 == 0) {
total = total + ans;
if (total >= MOD)
total -= MOD;
}
else {
total -= ans;
while (total < 0)
total += MOD;
}
}
printf ("%d\n", total - n);
return 0;
}