Pagini recente » Cod sursa (job #1149021) | Cod sursa (job #724807) | Cod sursa (job #1228242) | Cod sursa (job #247588) | Cod sursa (job #2638929)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
typedef unsigned short int si;
const int mod=3210121;
si maxx[30][(1<<20)];
si v[21][31];
int put[1001];
int power(int a,int b)
{
int ans=1;
while(b)
{
if(b&1) ans=(1LL*ans*a)%mod;
a=(1LL*a*a)%mod;
b>>=1;
}
return ans;
}
int main()
{
int k,s,n;
in>>k>>s>>n;
for(int i=0;i<n;++i)
for(int j=1;j<=k;++j)
in>>v[i][j];
put[0]=1;
int fact=1;
for(int i=1;i<=k;++i)
fact=(1LL*fact*i)%mod;
fact=power(fact,mod-2);
for(int i=1;i<=s;++i)
{
put[i]=fact;
for(int j=i+1;j<=i+k;++j)
put[i]=(1LL*put[i]*j)%mod;
}
int tot=put[s],lim=(1<<n);
for(int i=0;i<=k;++i)
maxx[i][0]=0;
int b,p,sum,r;
for(int kk=1;kk<lim;++kk)
{
r=kk&-kk; b=0;
while(r>1) r>>=1,++b;
p=kk-(kk&-kk);
sum=s;
for(int i=1;i<=k;++i)
{
maxx[i][kk]=max(maxx[i][p],v[b][i]);
sum-=(int)maxx[i][kk];
}
maxx[0][kk]=1-maxx[0][p];
if(sum>=0)
{
if(maxx[0][kk]) tot=(tot-put[sum]+mod)%mod;
else tot=(tot+put[sum])%mod;
}
}
out<<(tot-(s*k+1)%mod+mod)%mod<<'\n';
return 0;
}