Cod sursa(job #39760)

Utilizator MariusMarius Stroe Marius Data 26 martie 2007 22:32:55
Problema Cowfood Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
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];


void read_in(void)
{
     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);
}

int V[MAX_N], X[MAX_N], Res, sgn, cnt;

int solve(int sum, int i)
{
     if (i < K) {
        for (V[i] = X[i]; V[i] <= X[i] + sum; ++ V[i])
            solve(sum - (V[i] - X[i]), i + 1);
     } else if (i == K) {
        for (int j = cnt = 0; j < K; ++ j)
            if (V[j] > 0)   cnt ++;
        if (cnt > 1) {
            Res = (Res + sgn) % modulo;
            if (Res < 0)
               Res = Res + modulo;
        }
     }
}
        
int main(void)
{
    freopen(iname, "r", stdin);
    freopen(oname, "w", stdout);
    read_in();    

    for (int stp = 0; stp < 1 << N; ++ stp) {
        sgn = 0;
        for (int i = 0; i < N; ++ i)
            if (stp & 1 << i)     sgn ++;
        sgn = (sgn & 1) ? (-1) : (+1);
        
        for (int j = 0; j < K; ++ j)
            X[j] = 0;
        for (int i = 0; i < N; ++ i) {
            if (stp & 1 << i) 
               for (int j = 0; j < K; ++ j)
                   if (X[j] < A[i][j])   X[j] = A[i][j];
        }
        int sum = 0;
        for (int j = 0; j < K; ++ j)
            sum = sum + X[j];
        solve(S - sum, 0);
    }
    printf("%d\n", Res);    
    return 0;
}