Pagini recente » Cod sursa (job #1455413) | Cod sursa (job #2834516) | Cod sursa (job #2606840) | Cod sursa (job #2395436) | Cod sursa (job #593865)
Cod sursa(job #593865)
# include <cstdio>
const char *FIN = "cowfood.in", *FOU = "cowfood.out" ;
const int MAX_N = 21, MAX_K = 31, MAX_S = 10001, MOD = 3210121 ;
int A[MAX_N][MAX_K], s[MAX_K][MAX_S], sk[MAX_N][MAX_K], st[MAX_N] ;
int N, S, K, sol ;
inline int max (int A, int B) {
return (A > B ? A : B);
}
void cf (int k, int cap, int semn) {
if (k == cap) {
int aux = 0;
for (int i = 0; i < K; ++i)
aux += sk[k][i] ;
if (aux > S) return ;
sol += semn * s[K][S - aux];
if (sol < 0) sol = (sol + MOD) % MOD ;
return ;
}
for (int i = k ? 1 + st[k - 1] : 0; i <= N - cap + k; ++i) {
for (int j = 0; j < K; ++j)
sk[k + 1][j] = max (sk[k][j], A[i][j]) ;
st[k] = i, cf (k + 1, cap, semn) ;
}
}
int main (void) {
freopen (FIN, "r", stdin) ;
scanf ("%d %d %d", &K, &S, &N) ;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < K; ++j) {
scanf ("%d", A[i] + j) ;
}
}
for (int i = 0; i <= S; ++i)
s[1][i] = i + 1 ;
for (int i = 2; i <= K; ++i) {
s[i][0] = 1 ;
for (int j = 1; j <= S; ++j)
s[i][j] = s[i - 1][j] + s[i][j - 1], s[i][j] %= MOD ;
}
sol = (s[K][S] - K * S - 1 + MOD) % MOD ;
for (int i = 1; i <= N; ++i) {
cf (0, i, (i & 1) ? -1 : 1) ;
}
fprintf (fopen (FOU, "w"), "%d", sol) ;
}