Pagini recente » Cod sursa (job #2862846) | Istoria paginii preoni-2006/runda-4/clasament-10 | Cod sursa (job #589929) | Cod sursa (job #2846617) | Cod sursa (job #1551466)
#include <cstdio>
#include <algorithm>
#define DIM1 31
#define DIM2 10300
#define MOD 3210121
using namespace std;
int N, K, S, sol, sum;
int D[DIM1][DIM2], A[DIM1][DIM1], B[DIM1][DIM1];
void backTrack (int pos, int lev, int ok) {
if (pos != 0) {
int sum = S;
for (int i = 1; i <= K; i ++)
sum -= B[lev][i];
if (ok)
sol = (sol - D[K][sum] + MOD) % MOD;
else
sol = (sol + D[K][sum] + MOD) % MOD;
}
for (int i = pos + 1; i <= N; i ++) {
for (int j = 1; j <= K; j ++)
B[lev+1][j] = max (B[lev][j], A[i][j]);
backTrack (i, lev + 1, !ok);
for (int j = 1; j <= K; j ++)
B[lev+1][j] = 0;
}
return;
}
int main () {
freopen ("cowfood.in" ,"r", stdin );
freopen ("cowfood.out","w", stdout);
scanf ("%d %d %d", &K, &S, &N);
for (int i = 1; i <= K; i ++) {
D[i][0] = 1;
for (int j = 1; j <= S; j ++)
D[i][j] = (D[i-1][j] + D[i][j-1]) % MOD;
}
for (int j = 1; j <= S; j ++)
D[K][j] += D[K][j-1];
S -= K;
if (S < 0) {
printf ("%d\n", 0);
return 0;
} else {
sol = D[K][S];
for (int i = 1; i <= N; i ++) {
for (int j = 1; j <= K; j ++) {
scanf ("%d", &A[i][j]);
A[i][j] --;
}
}
backTrack (0, 0, 0);
}
printf ("%d\n", sol);
return 0;
}