Cod sursa(job #1730707)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 17 iulie 2016 15:09:08
Problema Cowfood Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <cstring>
#define MAXN 20
#define MAXK 30
#define MAXS 10000
#define MOD 3210121
int mat[MAXN][MAXK];
int v[MAXK];
int dp[MAXN+1][MAXS+1];
int main(){
   FILE*fi,*fout;
   int k,s,n,sol,rez,p2,i,j,con,sum,x;
   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<=n;i++)
     dp[i][0]=1;
   for(i=1;i<=n;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[n][j]+=dp[n][j-1];
     if(dp[n][j]>=MOD)
      dp[n][j]-=MOD;
   }
   rez=0;
   for(p2=1;p2<(1<<n);p2++){
      memset(v,0,sizeof(v));
      sum=s;
      con=0;
      for(i=0;i<n;i++)
       if((p2&(1<<i))){
         con++;
         for(j=0;j<k;j++)
           if(v[j]<mat[i][j])
             v[j]=mat[i][j];
       }
       for(i=0;i<k;i++)
         sum-=v[i];
       if(con&1){
          rez+=dp[n][sum];
          if(rez>=MOD)
            rez-=MOD;
       }
       else{
          rez-=dp[n][sum];
          if(rez<0)
            rez+=MOD;
       }
   }
   fprintf(fout,"%d" ,(dp[n][s-k]-rez+MOD)%MOD);
   fclose(fi);
   fclose(fout);
   return 0;
}