Pagini recente » Cod sursa (job #746468) | Cod sursa (job #75877) | Cod sursa (job #2486799) | Cod sursa (job #3207531) | Cod sursa (job #1525554)
#include <cstdio>
#define MOD 3210121
using namespace std;
int Max[32],nr,j,ans,a[32][32],n,i,m,s,Pos[10005][32];
inline void back(int nivel,int Max[32],int nr)
{
int i,Max1[32];for(i=0;i<=30;++i) Max1[i]=Max[i];
if(nivel<=n)
{
back(nivel+1, Max1, nr);
for(i=1;i<=m;++i)
if(a[nivel][i]>Max1[i])
{
Max1[0]-=Max1[i];
Max1[i]=a[nivel][i];
Max1[0]+=Max1[i];
}
if(Max1[0]<=s) back(nivel+1, Max1, nr+1);
return;
}
if(nr&1) ans=(ans-Pos[s-Max[0]][m]+MOD)%MOD;
else ans=(ans+Pos[s-Max[0]][m])%MOD;
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
scanf("%d%d%d",&m,&s,&n);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(i=1;i<=m;++i) Pos[0][i]=1;
// for(i=1;i<=s;++i) Pos[i][0]=1;
for(i=1;i<=s;++i)
for(j=1;j<=m;++j)
Pos[i][j]=(Pos[i][j-1]+Pos[i-1][j])%MOD;
for(i=1;i<=s;++i)
for(j=1;j<=m;++j)
Pos[i][j]=(Pos[i-1][j]+Pos[i][j])%MOD;
ans=0;
back(1,Max,0);
printf("%d\n",(ans-1-s*m+MOD)%MOD);
return 0;
}