Cod sursa(job #593863)

Utilizator SpiderManSimoiu Robert SpiderMan Data 4 iunie 2011 23:26:17
Problema Cowfood Scor 30
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.41 kb
# 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 += MOD, sol %= MOD ;
        return ;
    }
    for (int i = 1 + (k ? st[k - 1] : -1); 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) ;
}