Pagini recente » Cod sursa (job #1638546) | Cod sursa (job #2141520) | Cod sursa (job #131090) | Cod sursa (job #284186) | Cod sursa (job #1730784)
#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[MAXK+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<=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;
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(sum>=0)
if(con&1){
rez+=dp[k][sum];
if(rez>=MOD)
rez-=MOD;
}
else{
rez-=dp[k][sum];
if(rez<0)
rez+=MOD;
}
}
fprintf(fout,"%d" ,(dp[k][s-k]-rez+MOD)%MOD);
fclose(fi);
fclose(fout);
return 0;
}