Cod sursa(job #1734367)

Utilizator cella.florescuCella Florescu cella.florescu Data 27 iulie 2016 10:53:11
Problema Cowfood Scor 26
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#define MAXS 10000
#define MAXK 20
#define MOD 3210121

using namespace std;

struct experiment{
  int cant[MAXK];
} v[MAXK], aux[MAXK], exp;

int dp[MAXK+2][MAXS+1], n, k, s, sol;

inline int maxim(int a, int b){
  if(a>b)
    return a;
  return b;
}

void bkt(int niv, int cate){
  if(niv>=n){
    int sum=0;
    for(int i=0; i<k; i++)
      sum+=exp.cant[i];
    if(sum<=s && cate>0){
      if(cate&1){
        sol+=dp[k+1][s-sum];
        if(sol>=MOD)
          sol-=MOD;
      } else{
        sol-=dp[k+1][s-sum];
        if(sol<0)
          sol+=MOD;
      }
    }
    return;
  }
  bkt(niv+1, cate);
  for(int i=0; i<k; i++){
    aux[niv].cant[i]=exp.cant[i];
    exp.cant[i]=maxim(exp.cant[i], v[niv].cant[i]);
  }
  bkt(niv+1, cate+1);
  for(int i=0; i<k; i++)
    exp.cant[i]=aux[niv].cant[i];
}

int main()
{
    FILE *fin, *fout;
    int i, j;
    fin=fopen("cowfood.in", "r");
    fscanf(fin, "%d%d%d", &k, &s, &n);
    for(i=0; i<n; i++)
      for(j=0; j<k; j++)
        fscanf(fin, "%d", &v[i].cant[j]);
    fclose(fin);
    for(j=0; j<=k+1; j++)
      dp[j][0]=1;
    for(i=1; i<=k+1; i++){
      for(j=0; j<=s+1; j++){
        if (i==0 || i==1)
          dp[i][j]=1;
        else
          dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;
      }
    }
    bkt(0, 0);
    fout=fopen("cowfood.out", "w");
    fprintf(fout, "%d\n", (dp[k+1][s]-sol-s*k-1+3*MOD)%MOD);
    fclose(fout);
    return 0;
}