Pagini recente » Cod sursa (job #1737230) | Cod sursa (job #2420238) | Cod sursa (job #1305494) | Cod sursa (job #1774105) | Cod sursa (job #2036975)
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MOD 3210121
using namespace std;
FILE *f=fopen("cowfood.in","r");
FILE *g=fopen("cowfood.out","w");
int fact[20005];
int ifact[20005];
int N,K,S;
int A[25][35];
int tmp[35];
int lgpow(int b,int e)
{
int p=1;
while(e)
{
if(e&1)p=1LL*p*b%MOD;
b=1LL*b*b%MOD;
e>>=1;
}
return p;
}
int C(int N,int K)
{
return 1LL*(1LL*fact[N]*ifact[K]%MOD)*ifact[N-K]%MOD;
}
int main()
{
fact[0]=1;
for(int i=1;i<=20000;i++)
fact[i]=1LL*fact[i-1]*i%MOD;
ifact[20000]=lgpow(fact[20000],MOD-2);
for(int i=20000-1;i>=0;i--)
ifact[i]=1LL*ifact[i+1]*(i+1)%MOD;
fscanf(f,"%d%d%d",&K,&S,&N);
for(int i=1;i<=N;i++)for(int j=1;j<=K;j++)fscanf(f,"%d",&A[i][j]);
int ans=C(S+K,K)-1-K*S;
for(int conf=1;conf<(1<<N);conf++)
{
int sgn=1;
for(int i=1;i<=K;i++)tmp[i]=0;
for(int i=0;i<N;i++)
{
if((conf>>i)&1)
{
sgn*=-1;
for(int j=1;j<=K;j++)
{
tmp[j]=max(tmp[j],A[i+1][j]);
}
}
}
int s=S;
for(int i=1;i<=K;i++)s-=tmp[i];
if(s<0)continue;
ans+=sgn*C(s+K,K);
if(ans<0)ans+=MOD;
if(ans>=MOD)ans-=MOD;
}
fprintf(g,"%d",ans);
fclose(f);
fclose(g);
return 0;
}