Cod sursa(job #1551461)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 15 decembrie 2015 21:57:12
Problema Cowfood Scor 22
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 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) {

    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 ++) {
        for (int j = 0; j <= S; j ++) {
            if (i == 1) D[i][j] = (j + 1) % MOD;
            else if (j == 0)
                D[i][j] = 1;
            else
                D[i][j] = (D[i-1][j] + D[i][j-1]) % MOD;
        }
    }

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