Cod sursa(job #1551488)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 15 decembrie 2015 22:27:42
Problema Cowfood Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#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) {

    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;
    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;
}