Pagini recente » Cod sursa (job #2023902) | Cod sursa (job #2132318) | Cod sursa (job #815612) | Cod sursa (job #1746561) | Cod sursa (job #2088630)
#include <cstdio>
#include <algorithm>
const int MOD = 3210121;
const int MAX_N = 20;
const int MAX_K = 30;
const int MAX_S = 10000;
int N, K, S;
int a[1 + MAX_N][1 + MAX_K];
int cop[1 + MAX_N][1 + MAX_K];
int dp[1 + MAX_K][1 + MAX_S];
int v[1 + MAX_K];
int total;
void pinex(int pas, int nr) {
if (pas == N + 1) {
int s = 0;
for (int i = 1; i <= K; i++) {
s += v[i];
}
if (s <= S) {
int sign;
sign = (nr % 2 == 1) ? 1 : -1;
total = (total + sign * dp[K][S - s]) % MOD;
}
} else {
pinex(pas + 1, nr);
for (int i = 1; i <= K; i++) {
cop[pas][i] = v[i];
v[i] = std::max(v[i], a[pas][i]);
}
pinex(pas + 1, nr + 1);
for (int i = 1; i <= K; i++) {
v[i] = cop[pas][i];
}
}
}
int main() {
freopen ("cowfood.in", "r", stdin);
freopen ("cowfood.out", "w", stdout);
scanf("%d%d%d", &K, &S, &N);
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
scanf("%d", &a[i][j]);
}
}
for (int i = 0; i <= S; i++) {
dp[0][i] = 1;
}
for (int i = 1; i <= K; i++) {
dp[i][0] = 1;
for (int j = 1; j <= S; j++) {
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
}
}
total = 0;
pinex(1, 1);
int ans = (total - S * K - 1) % MOD;
printf("%d\n", ans);
return 0;
}