Pagini recente » Cod sursa (job #84070) | Cod sursa (job #228237) | Cod sursa (job #2755094) | Cod sursa (job #727448) | Cod sursa (job #1154081)
#include<stdio.h>
#include<algorithm>
#define maxn 25
#define maxk 35
#define maxs 10005
#define MOD 3210121
using namespace std;
int n,S,K,fail,sol;
int a[maxn][maxk],dp[maxs][maxk];
int x[maxk],conf[maxn][maxk];
void read()
{
scanf("%d%d%d",&K,&S,&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=K;j++)
scanf("%d",&a[i][j]);
}
void preproc()
{
for(int i=1;i<=K+1;i++) dp[0][i]=1;
for(int i=1;i<=S;i++) dp[i][1]=1;
for(int i=1;i<=S;i++)
for(int j=2;j<=K+1;j++)
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;
}
void back(int k,int sgn)
{
if(k>1)
{
int sc=S;
for(int i=1;i<=K;i++) sc-=conf[k-1][i];
if(sc>=0) fail+=(sgn*dp[sc][K+1]);
else return;
if(fail<0) fail+=MOD; if(fail>=MOD) fail-=MOD;
}
if(k>n) return;
for(int i=x[k-1]+1;i<=n;i++)
{
x[k]=i;
for(int j=1;j<=K;j++) conf[k][j]=max(conf[k-1][j],a[i][j]);
back(k+1,-sgn);
}
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
read();
preproc();
back(1,-1);
sol=dp[S][K+1]-S*K-fail-1;
while(sol<0) sol+=MOD;
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}