Cod sursa(job #477760)

Utilizator vladiiIonescu Vlad vladii Data 16 august 2010 11:53:20
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define nmax 21
#define kmax 32
#define smax 10002
#define mod 3210121

int K, S, N, sol;
int M[smax][kmax], P[smax][kmax], F[kmax], A[nmax][kmax];

void back(int niv, int sgn) {
    int Fax[kmax], i, sum = 0;

    if(niv == N + 1) {
         for(i=1; i<=K; i++) {
              sum += F[i];
         }
         if(!(sgn % 2)) {
              if(S - sum >= 0) {
                   sol += M[S - sum][K];
                   sol %= mod;
              }
         }
         else {
              if(S - sum >= 0) {
                   sol -= M[S - sum][K];
                   if(sol < 0) sol += mod;
              }
         }

         return;
    }

    back(niv + 1, sgn);

    for(i=1; i<=K; i++) {
         Fax[i] = F[i];
    }
    for(i=1; i<=K; i++) {
         F[i] = max(F[i], A[niv][i]);
    }

    back(niv + 1, sgn + 1);

    for(i=1; i<=K; i++) {
         F[i] = Fax[i];
    }
}

int main() {
    FILE *f1=fopen("cowfood.in", "r"), *f2=fopen("cowfood.out", "w");
    int i, j, p, q;

    fscanf(f1, "%d %d %d\n", &K, &S, &N);
    for(i=1; i<=N; i++) {
         for(j=1; j<=K; j++) {
              fscanf(f1, "%d", &A[i][j]);
         }
    }

    P[0][0] = M[0][0] = 1;
    for(i=1; i<=S; i++) {
         M[i][0] = 1;
    }
    for(j=1; j<=K; j++) {
         P[0][j] = M[0][j] = 1;

         for(i=1; i<=S; i++) {
              P[i][j] = M[i][j - 1];
              M[i][j] = (M[i - 1][j] + P[i][j]) % mod;
         }
    }

    back(1, 0);

    sol -= (K*S + 1);
    while(sol < 0) sol += mod;

    fprintf(f2, "%d\n", sol);
    fclose(f1); fclose(f2);
    return 0;
}