Pagini recente » Cod sursa (job #311182) | Cod sursa (job #3123021) | Cod sursa (job #2832023) | Cod sursa (job #2776533) | Cod sursa (job #615441)
Cod sursa(job #615441)
#include <cstdio>
#define MOD 3210121
#define smax 10010
#define nmax 33
int k, s, n, d[nmax][smax], a[nmax][nmax], mx[nmax], v[nmax], sol;
void back(int p, int mx[nmax])
{
int i, cnt, x, cmx[nmax];
if (p>n)
{
cnt=0;
for (i=1; i<=n; i++) cnt+=v[i];
cnt&=1;
x=s;
for (i=1; i<=k; i++) x-=mx[i];
x=d[k][x];
if (x>0)
if (!cnt) sol=sol+x+MOD; else sol=sol+MOD-x;
sol%=MOD;
} else
{
v[p]=0;
back(p+1, mx);
v[p]=1;
for (i=1; i<=k; i++)
cmx[i]=mx[i];
for (i=1; i<=k; i++)
if (a[p][i]>mx[i]) mx[i]=a[p][i];
back(p+1, mx);
for (i=1; i<=k; i++) mx[i]=cmx[i];
}
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
scanf("%d %d %d", &k, &s, &n);
int i, j;
for (i=1; i<=n; i++)
for (j=1; j<=k; j++) scanf("%d", &a[i][j]);
for (i=0; i<=s; i++) d[0][i]=1;
for (i=1; i<=k; i++) d[i][0]=1;
for (i=1; i<=k; i++)
{
for (j=1; j<=s; j++)
{
d[i][j]=d[i-1][j]+d[i][j-1];
if (d[i][j]>MOD) d[i][j]-=MOD;
}
}
back(1, mx);
sol-=1+k*s;
if (sol<0) sol+=MOD;
printf("%d\n",sol);
}