Pagini recente » Cod sursa (job #1593085) | Cod sursa (job #3208132) | Cod sursa (job #1750402) | Cod sursa (job #1136494) | Cod sursa (job #1658244)
#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, st [K], s, k, n;
int dp [S][K];
void preg (int lim) {
int i, j;
dp [0][0] = 1;
for (i = 1; i <= lim; 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; i <= lim; 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;
}
}
int ans (int *st) {
int sum = 0, i;
for (i = 1; i <= k; i ++)
sum += st [i];
sum = s - sum;
if (sum < 0)
return 0;
return dp [sum + k - 1][k - 1];
}
void solve (int ind, int num, int *st) {
int st2 [K], i;
if (ind == n + 1) {
if (num == 0)
return;
if (num % 2 == 0)
total += ans (st);
else total -= ans (st);
while (total < 0)
total += MOD;
while (total >= MOD)
total -= MOD;
return;
}
for (i = 1; i <= k; i ++)
st2 [i] = st [i];
solve (ind + 1, num, st2);
for (i = 1; i <= k; i ++)
st2 [i] = max (st2 [i], a [ind][i]);
solve (ind + 1, num + 1, st2);
}
int main () {
int 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);
total = dp [s + k - 1][k - 1] - dp [k - 1][k - 1] - k * s;
while (total < 0)
total += MOD;
solve (1, 0, st);
printf ("%d\n", total);
return 0;
}