Cod sursa(job #164211)

Utilizator FlorinC1996Florin C FlorinC1996 Data 23 martie 2008 17:56:13
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>   
#include <memory>   
using namespace std;   
  
const char iname[] = "cowfood.in";   
const char oname[] = "cowfood.out";   
  
#define MAX_N  20   
#define MAX_K  30   
#define MAX_S  10000   
#define modulo 3210121   
  
int K, S, N;   
  
int A[MAX_N][MAX_K];   
  
int num[MAX_K + 1][MAX_S + 1];   
  
  
void read_in(int A[][MAX_K], int *K, int *S, int *N)   
{   
    scanf("%d %d", K, S);   
    int i;   
    int j;   
    for (scanf("%d", N), i = 0; i < *N; ++ i)   
        for (j = 0; j < *K; ++ j)   
            scanf("%d", A[i] + j);   
}   
  
void count(int num[][MAX_S + 1], int K, int S)   
{   
    for (int j = 0; j <= S; ++ j)   
        num[1][j] = 1;   
    for (int i = 2; i <= K; ++ i) {   
        num[i][0] = 1;   
        for (int j = 1; j <= S; ++ j)   
            num[i][j] = (num[i][j - 1] + num[i - 1][j]) % modulo;   
    }   
    for (int i = 1; i <= K; ++ i)   
        for (int j = 1; j <= S; ++ j)   
            num[i][j] = (num[i][j] + num[i][j - 1]) % modulo;   
}   
  
int X[MAX_K], Res = 0;   
  
void f(int i, int sgn)    
{   
    if (i < N) {   
        f(i + 1, sgn);   
        int T[MAX_K];   
        memcpy(T, X, sizeof(T));   
        for (int j = 0; j < K; ++ j)   
            if (X[j] < A[i][j])    X[j] = A[i][j];   
        f(i + 1, sgn == +1 ? -1 : +1);   
        memcpy(X, T, sizeof(T));   
    } else if (i == N) {   
        int sum = 0;   
        int cnt = 0;   
        for (int j = 0; j < K; ++ j) {   
            if (X[j] > 0)   
                cnt ++, sum = sum + X[j];   
        }   
        if (S < sum)  return ;   
  
        if (cnt == 0)   
            Res = Res + sgn * (num[K][S] - 1 - K * S);   
        else if (cnt == 1)   
            Res = Res + sgn * (num[K][S - sum] - (S - sum + 1));   
        else if (cnt > 1)   
            Res = Res + sgn * num[K][S - sum];   
  
        Res = Res % modulo;   
    }   
}   
  
int main(void)   
{   
    freopen(iname, "r", stdin);   
    read_in(A, &K, &S, &N);   
    count(num, K, S);   
    f(0, 1);   
    if (Res <  0)   
        Res += modulo;   
    freopen(oname, "w", stdout);   
    printf("%d\n", Res);   
    return 0;   
}