Pagini recente » Cod sursa (job #1686916) | Cod sursa (job #1305492) | Cod sursa (job #1791154) | Cod sursa (job #2876540) | Cod sursa (job #573866)
Cod sursa(job #573866)
#include <algorithm>
using namespace std;
#define MOD 3210121
#define MAX 10005
#define DIM 35
int v[DIM][DIM],s[DIM][MAX];
int cnt[MAX],sol[DIM];
int K,S,N,nrt;
void read ()
{
int i,j;
scanf ("%d%d%d",&K,&S,&N);
for (i=1; i<=N; ++i)
for (j=1; j<=K; ++j)
scanf ("%d",&v[i][j]);
}
void back (int pas,int semn,int cur[DIM])
{
int aux[DIM];
int i,sum;
if (pas==N+1)
{
sum=S;
for (i=1; i<=K; ++i)
sum-=cur[i];
if (sum>=0)
if (!semn)
nrt=(nrt+cnt[sum])%MOD;
else
nrt=(nrt-cnt[sum]+MOD)%MOD;
}
else
{
for (i=1; i<=K; ++i)
aux[i]=cur[i];
back (pas+1,semn,aux);
for (i=1; i<=K; ++i)
cur[i]=max (cur[i],v[pas][i]);
back (pas+1,semn^1,cur);
}
}
void solve ()
{
int i,j;
s[0][0]=1;
for (i=1; i<=K; ++i)
for (j=0; j<=S; ++j)
if (!j)
s[i][j]=s[i-1][j];
else
s[i][j]=(s[i-1][j]+s[i][j-1])%MOD;
cnt[0]=s[K][0];
for (i=1; i<=S; ++i)
cnt[i]=(cnt[i-1]+s[K][i])%MOD;
back (1,0,sol);
nrt-=K*S+1;
if (nrt<0)
nrt=MOD+nrt%MOD;
printf ("%d",nrt);
}
int main ()
{
freopen ("cowfood.in","r",stdin);
freopen ("cowfood.out","w",stdout);
read ();
solve ();
return 0;
}