Pagini recente » Cod sursa (job #2733567) | Cod sursa (job #1032038) | Cod sursa (job #1195189) | Cod sursa (job #1948062) | Cod sursa (job #906707)
Cod sursa(job #906707)
#include<cstdio>
#define MOD 3210121
//n+k-1 choose k
long long modpow (long long n, int e)
{
if(!e)
return 1;
long long x=modpow (n,e/2);
x=(x*x)%MOD;
if(e%2)
x=(x*n)%MOD;
return x;
}
long long fact[10050];
long long mfact[10050];
long long choose (long long n, long long k)
{
if(n<k)
return 0;
return ((long long)fact[n])*mfact[n-k]%MOD*mfact[k]%MOD;
}
long long calc (long long n, long long k)
{
if(n<0)
return 0;
return choose (n+k-1, n);
}
int v[25][35];
int main (void)
{
freopen ("cowfood.in","r",stdin);
#ifdef INFOARENA
freopen ("cowfood.out","w",stdout);
#endif
fact[0]=1;
for(int i=1;i<10050;i++){
fact[i]=fact[i-1]*i%MOD;
mfact[i]=modpow (fact[i],MOD-2);
}
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 ("%d",v[i]+j);
long long ret=calc (s,k+1)-1-s*k;
for(int i=1;i<1<<n;i++){
int ss=s;
for(int z=0;z<k;z++){
int mx=0;
for(int j=0;j<n;j++)
if(i&(1<<j) && v[j][z]>mx)
mx=v[j][z];
ss-=mx;
}
if(__builtin_popcount (i)%2)
ret-=calc (ss,k+1);
else
ret+=calc (ss,k+1);
}
printf ("%lld",ret);
return 0;
}