Pagini recente » Cod sursa (job #1259689) | Cod sursa (job #861918) | Cod sursa (job #1998236) | Cod sursa (job #2573545) | Cod sursa (job #1430377)
#include <cstdio>
#include <algorithm>
#define MOD 3210121
#define INF 2000000000
#define Nmax 35
using namespace std;
int a[Nmax][Nmax],v[Nmax],fact[100005],n;
inline int Pow_Log(int x, int p)
{
int sol=1;
while(p)
{
if(p&1)
{
sol=(1LL*sol*x)%MOD; --p;
}
p>>=1;
x=(1LL*x*x)%MOD;
}
return sol;
}
inline int Comb(int n, int k)
{
return (1LL*((1LL*fact[n]*Pow_Log(fact[k],MOD-2))%MOD)*Pow_Log(fact[n-k],MOD-2))%MOD;
}
int main()
{
int sol=0,i,j,kkt,s,k,stare;
freopen ("cowfood.in","r",stdin);
freopen ("cowfood.out","w",stdout);
fact[0]=1;
for(i=1;i<=100000;++i) fact[i]=(1LL*fact[i-1]*i)%MOD;
scanf("%d%d%d", &k,&s,&n);
for(i=1;i<=s;++i)
{
if(k>i) continue;
sol+=Comb(i-1,k-1);
if(sol>=MOD) sol-=MOD;
}
// printf("%d\n", sol);
for(i=1;i<=n;++i)
for(j=1;j<=k;++j) scanf("%d", &a[i][j]);
for(stare=1;stare<(1<<n);++stare)
{
int cnt=0;
for(i=1;i<=k;++i) v[i]=-INF;
for(j=0;j<n;++j)
if((1<<j)&stare)
{
++cnt;
for(kkt=1;kkt<=k;++kkt) v[kkt]=max(v[kkt],a[j+1][kkt]);
}
int S=0;
for(kkt=1;kkt<=k;++kkt) S+=v[kkt];
//printf("%d\n", S);
if(cnt&1)
{
for(kkt=S;kkt<=s;++kkt)
sol-=Comb(kkt-S+k-1,k-1);
if(sol<0) sol+=MOD;
}
else
{
for(kkt=S;kkt<=s;++kkt)
sol+=Comb(kkt-S+k-1,k-1);
if(sol>=MOD) sol-=MOD;
}
}
printf("%d\n", sol);
return 0;
}