Pagini recente » Cod sursa (job #343628) | Cod sursa (job #2598994) | Cod sursa (job #2264216) | Cod sursa (job #761354) | Cod sursa (job #998003)
Cod sursa(job #998003)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=3210121;
int f[20][31];
int p[31];
int pw(int x,int y)
{
int r;
for(r=1;y;y>>=1)
{
if(y&1) r=(1LL*r*x)%mod;
x=(1LL*x*x)%mod;
}
return r;
}
int invmod(int x) {return pw(x,mod-2);}
int C(int n,int k)
{
int num=1,den=1;
for(int i=1;i<=k;i++)
{
num=(1LL*num*(n-i+1))%mod;
den=(1LL*den*i)%mod;
}
return (1LL*num*invmod(den))%mod;
}
int d[10005];
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
int k,s,n;
scanf("%d%d%d",&k,&s,&n);
for(int i=0;i<n;i++)
for(int j=1;j<=k;j++)
scanf("%d",&f[i][j]);
d[0]=1;
for(int i=1;i<=s;i++)
d[i]=(C(i+k-1,k-1)+d[i-1])%mod;
int ans=0;//C(s+n-1,n-1);fprintf(stderr,"%d\n",ans);
for(int i=0;i<(1<<n);i++)
{
memset(p,0,sizeof(p));int semn=1;
for(int j=0;j<n;j++)
if(i&(1<<j))
{
for(int K=1;K<=k;K++)
p[K]=max(p[K],f[j][K]);
semn=-semn;
}
int S=s;
for(int j=1;j<=k;j++)
S-=p[j];
//fprintf(stderr,"%d -> %d, %d",i,semn,ans);
ans=(ans+semn*d[S]+mod)%mod;
//fprintf(stderr,"->%d\n",ans);
}
printf("%d\n",(ans-s*k-1+2*mod)%mod);
return 0;
}