Cod sursa(job #1731626)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 19 iulie 2016 13:55:52
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <cstring>
#define MAXN 20
#define MAXK 30
#define MAXS 10000
#define MOD 3210121
int mat[MAXN][MAXK];
int v[MAXN][MAXK];
int dp[MAXK+1][MAXS+1];
int k,s,n,rez;
void bkt(int x,int conf,int con,int last){
    int sum,i,j;
    if(last>=0){
      sum=s;
      for(i=0;i<k;i++)
        sum-=v[last][i];
      if(sum>=0)
        if(con&1){
          rez+=dp[k][sum];
          if(rez>=MOD)
            rez-=MOD;
        }
        else{
           rez-=dp[k][sum];
           if(rez<0)
            rez+=MOD;
        }
    }
    for(i=x;i<n;i++){
        for(j=0;j<k;j++)
          if(last==-1||mat[i][j]>v[last][j])
            v[i][j]=mat[i][j];
          else
            v[i][j]=v[last][j];
        bkt(i+1,conf+(1<<i),con+1,i);
        memset(v[i],0,sizeof(v[i]));
    }
}
int main(){
   FILE*fi,*fout;
   int i,j;
   fi=fopen("cowfood.in" ,"r");
   fout=fopen("cowfood.out" ,"w");
   fscanf(fi,"%d%d%d" ,&k,&s,&n);
   for(i=0;i<n;i++)
    for(j=0;j<k;j++)
     fscanf(fi,"%d" ,&mat[i][j]);
   for(i=0;i<=k;i++)
     dp[i][0]=1;
   for(i=1;i<=k;i++)
     for(j=1;j<=s;j++){
        dp[i][j]=dp[i-1][j]+dp[i][j-1];
        if(dp[i][j]>=MOD)
          dp[i][j]-=MOD;
     }
   for(j=1;j<=s;j++){
     dp[k][j]+=dp[k][j-1];
     if(dp[k][j]>=MOD)
      dp[k][j]-=MOD;
   }
   rez=0;
   bkt(0,0,0,-1);
   if(s<k)
      fprintf(fout,"0");
   else
      fprintf(fout,"%d" ,(dp[k][s-2]-rez+MOD)%MOD);
   fclose(fi);
   fclose(fout);
   return 0;
}