Pagini recente » Cod sursa (job #1519126) | Cod sursa (job #1182648) | Cod sursa (job #2012838) | Cod sursa (job #2115294) | Cod sursa (job #1495246)
#include <cstdio>
#define MOD 3210121
#define ub(i) (i&(-i))
using namespace std;
int Max[(1<<20)+1][32],nr,j,ans,a[32][32],n,i,m,s,Pos[10005][32];
inline void back(int nivel,int bit,int nr)
{
if(nivel<=n)
{
back(nivel+1, bit<<1, nr);
if(Max[bit][0]<=s) back(nivel+1, (bit<<1)+1, nr+1);
return;
}
//bit>>=1;
if(nr&1) ans=(ans-Pos[s-Max[bit][0]][m]+MOD)%MOD;
else ans=(ans+Pos[s-Max[bit][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)
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;
int x=0;
for(i=0;i<(1<<n);++i, x=ub(i))
for(j=1;j<=m;++j)
{
if(Max[i-x][j]>a[x][j]) Max[i][j]=Max[i-x][j];
else Max[i][j]=a[x][j];
Max[i][0]+=Max[i][j];
}
ans=0;
back(1,0,0);
// back(1,1,0);
printf("%d\n",(ans-1-s*m+MOD)%MOD);
return 0;
}