Pagini recente » Cod sursa (job #1202733) | Cod sursa (job #669890) | Cod sursa (job #1228147) | Cod sursa (job #130918) | Cod sursa (job #1731627)
#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]-rez-s*k-1)%MOD+MOD)%MOD);
fclose(fi);
fclose(fout);
return 0;
}