Pagini recente » Cod sursa (job #3180288) | Cod sursa (job #2680774) | Cod sursa (job #527276) | Cod sursa (job #641086) | Cod sursa (job #627470)
Cod sursa(job #627470)
#include <stdio.h>
#include <string.h>
#define NMAX 21
#define KMAX 31
#define LMAX 10005
#define HMAX (1<<20)
#define MOD 3210121
#define ll long long
int k,s,n,A[NMAX][KMAX],S[KMAX][LMAX],rez,cfg[KMAX],nbiti,sum;
char marc[NMAX];
void read()
{
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]);
}
void precompute()
{
int i,j;
for (i=0; i<=s; i++)
S[1][i]=i+1;
for (i=2; i<=k; i++)
for (j=0; j<=s; j++)
S[i][j]=(S[i][j-1]+S[i-1][j])%MOD;
}
inline int max(int x,int y)
{
return x>y ? x : y;
}
void update()
{
if (nbiti==0)
return ;
if (sum>s)
return ;
if (nbiti & 1)
{
rez-=S[k][s-sum];
if (rez<0)
rez+=MOD;
}
else
{
rez+=S[k][s-sum];
if (rez>MOD)
rez-=MOD;
}
}
void back(int poz)
{
if (poz==n+1)
{
update();
return ;
}
marc[poz]=0;
back(poz+1);
int i,cfg2[KMAX];
for (i=1; i<=k; i++)
{
cfg2[i]=cfg[i];
sum-=cfg[i];
cfg[i]=max(cfg[i],A[poz][i]);
sum+=cfg[i];
}
nbiti++;
marc[poz]=1;
back(poz+1);
for (i=1; i<=k; i++)
{
sum-=cfg[i];
cfg[i]=cfg2[i];
sum+=cfg[i];
}
nbiti--;
}
void solve()
{
rez=S[k][s];
rez-=(k*s+1)%MOD;
if (rez<0)
rez+=MOD;
back(1);
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
read();
precompute();
solve();
printf("%d\n",rez);
return 0;
}