Pagini recente » Cod sursa (job #1402087) | Cod sursa (job #113769) | Cod sursa (job #1312769) | Cod sursa (job #2415740) | Cod sursa (job #998021)
Cod sursa(job #998021)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=3210121;
unsigned short f[20][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 fact[10005];
int C(int n,int k)
{
int ans=fact[n];
ans=(1LL*ans*invmod(fact[k]))%mod;
ans=(1LL*ans*invmod(fact[n-k]))%mod;
return ans;
}
int d[10005];
unsigned short list[1<<20][30];
short int ind[1<<20];
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=0;j<k;j++)
scanf("%hu",&f[i][j]);
fact[0]=1;
for(int i=1;i<=s+k-1;i++)
fact[i]=(1LL*fact[i-1]*i)%mod;
d[0]=1;
for(int i=1;i<=s;i++)
d[i]=(C(i+k-1,k-1)+d[i-1])%mod;
for(int i=0;i<20;i++)
ind[1<<i]=i;
int ans=0;//C(s+n-1,n-1);fprintf(stderr,"%d\n",ans);
for(int i=0;i<(1<<n);i++)
{
if(i!=0)
memcpy(list[i],list[i&(i-1)],sizeof(list[i]));
int ind,S=s,semn=1;
for(int I=i;I;I&=(I-1)) semn=-semn;
ind=(::ind)[i^(i&(i-1))];
for(int j=0;j<k;j++)
if(list[i][j]<f[ind][j])
list[i][j]=f[ind][j];
if(i==0) memset(list[i],0,sizeof(list[i]));
for(int j=0;j<k;j++)
S-=list[i][j];
//fprintf(stderr,"%d -> %d, %d",i,semn[i],ans);
//fprintf(stderr,"%d, %d->",i,ind);
//for(int j=1;j<=k;j++)
// fprintf(stderr,"%d ",list[i][j]);
//fprintf(stderr,"\n");
ans=ans+semn*d[S];
if(ans<0) ans+=mod;
if(ans>=mod) ans-=mod;
//fprintf(stderr,"->%d\n",ans);
}
printf("%d\n",(ans-s*k-1+mod)%mod);
return 0;
}