Cod sursa(job #1524928)

Utilizator hrazvanHarsan Razvan hrazvan Data 14 noiembrie 2015 16:01:41
Problema Cowfood Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#define MAXN 20
#define MAXK 30
#define MAXS 10000
#define MOD 3210121
int n, k, s;
int food[MAXN][MAXK];
int v[MAXK];
int comb[MAXS + MAXK][MAXK];
int rez = 0;

inline int max2(int a, int b){
  return a > b ? a : b;
}

inline void precalc(){
  int i, j;
  comb[0][0] = 1;
  for(i = 1; i < MAXS + MAXK; i++){
    comb[i][0] = 1;
    for(j = 1; j < MAXK; j++){
      comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
      if(comb[i][j] >= MOD)
        comb[i][j] -= MOD;
    }
  }
  for(j = 0; j < MAXK; j++){
    for(i = j + 1; i < MAXS + MAXK; i++){
      comb[i][j] += comb[i - 1][j];
      if(comb[i][j] >= MOD)
        comb[i][j] -= MOD;
    }
  }
}

inline int solve(int *v){
  int cs = s, i, rez;
  for(i = 0; i < k; i++)
    cs -= v[i];
  if(cs < 0)
    return 0;
  else{
    rez = comb[k - 1 + cs][k - 1];
    char g = 0;
    for(i = 0; i < k; i++)
      if(v[i] > 0)
        g++;
    if(g == 0)
      rez -= k * cs + 1;
    else  if(g == 1)
      rez -= cs + 1;
    rez += MOD;
    while(rez >= MOD)
      rez -= MOD;
    return rez;
  }
}

void pinex(int p, int nr, int *v){
  if(p == n){
    if(nr & 1)
      rez -= solve(v);
    else
      rez += solve(v);
    rez += MOD;
    while(rez >= MOD)
      rez -= MOD;
  }
  else{
    int v1[MAXK], i;
    for(i = 0; i < k; i++)
      v1[i] = v[i];
    pinex(p + 1, nr, v1);
    for(i = 0; i < k; i++)
      v1[i] = max2(v1[i], food[p][i]);
    pinex(p + 1, nr + 1, v1);
  }
}

int main(){
  precalc();
  FILE *in = fopen("cowfood.in", "r");
  int i, j;
  fscanf(in, "%d%d%d", &k, &s, &n);
  for(i = 0; i < n; i++){
    for(j = 0; j < k; j++){
      fscanf(in, "%d", &food[i][j]);
    }
  }
  fclose(in);
  for(i = 0; i < k; i++)
    v[i] = 0;
  pinex(0, 0, v);
  FILE *out = fopen("cowfood.out", "w");
  fprintf(out, "%d", rez);
  fclose(out);
  return 0;
}