Cod sursa(job #793728)

Utilizator visanrVisan Radu visanr Data 3 octombrie 2012 21:34:32
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.22 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

#define nmax 25
#define kmax 35
#define smax 10010
#define modulo 3210121

int N, K, S, M[kmax][smax], A[nmax][kmax], ans;

void Back(int P, int sign, int V[])
{
    if(P == N)
    {
        int crtSum = S;
        for(int i = 0; i < K; i++) crtSum -= V[i];
        if(crtSum >= 0) ans = (ans + sign * M[K][crtSum] + modulo) % modulo;
        return ;
    }
    Back(P + 1, sign, V);
    int V2[kmax];
    for(int i = 0; i < K; i++) V2[i] = max(V[i], A[P][i]);
    Back(P + 1, -sign, V2);
}

int main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
    int i, j;
    scanf("%i %i %i", &K, &S, &N);
    for(i = 0; i < N; i++)
        for(j = 0; j < K; j++)
            scanf("%i", &A[i][j]);
    for(i = 0; i <= S; i++)
        M[0][i] = 1;
    for(i = 1; i <= K; i++)
        for(j = 0; j <= S; j++)
        {
            M[i][j] = M[i - 1][j];
            if(j) M[i][j] = (M[i][j] + M[i][j - 1]) % modulo;
        }
    ans = (modulo - S * K - 1) % modulo;
    int V[kmax];
    memset(V, 0, sizeof(V));
    Back(0, 1, V);
    printf("%i\n", ans);
    return 0;
}