Pagini recente » Arhiva de probleme | Cod sursa (job #222756) | Cod sursa (job #1330862) | Diferente pentru home intre reviziile 124 si 123 | Cod sursa (job #1551491)
#include <cstdio>
#include <algorithm>
#define DIM1 33
#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) {
for (int i = 1; i <= K; i ++)
B[lev+1][i] = B[lev][i];
if (lev != 0) {
int sum = S;
for (int i = 1; i <= K; i ++)
sum -= B[lev][i];
if (sum < 0)
return;
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+1][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;
}
sol = S * K;
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;
}