Pagini recente » Cod sursa (job #2511617) | Cod sursa (job #3141087) | Cod sursa (job #794657) | Cod sursa (job #189130) | Cod sursa (job #2338796)
#include <bits/stdc++.h>
#define Int long long
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
const Int mod=3210121;
int k,s,n,i,j,ans,a[25][35];
Int fac[20010];
Int put(Int b,int e)
{
Int ret=1;
while(e)
{
if(e&1)
ret=(ret*b)%mod;
b=(b*b)%mod;
e>>=1;
}
return ret;
}
int C(int n,int k)
{
Int ret=(fac[n]*put(fac[k],mod-2))%mod;
//cout<<n<<' '<<k<<" : "<<fac[n]<<' '<<fac[k]<<' '<<fac[n-k]<<'\n';
return (ret*put(fac[n-k],mod-2))%mod;
}
void bkt(int poz,int mask)
{
if(poz==n+1)
{
if(!mask)
return;
int sum=0;
for(i=1; i<=k; i++)
{
int aux=0;
for(j=1;j<=n;j++)
if((1<<(j-1))&mask)
aux=max(aux,a[j][i]);
sum+=aux;
}
if(sum>s)
return;
int auxx=0;
while(mask)
{
if(mask&1)
auxx++;
mask>>=1;
}
if(auxx&1)
{
int aux=C(s-sum+k,k);
ans=(aux+ans>=mod)?aux+ans-mod:aux+ans;
}
else
{
int aux=C(s-sum+k,k);
ans=(ans-aux<0)?ans-aux+mod:ans-aux;
}
return ;
}
bkt(poz+1,mask);
bkt(poz+1,mask|(1<<poz-1));
}
int main()
{
f>>k>>s>>n;
fac[0]=1;
for(i=1; i<=s+k; i++)
fac[i]=(fac[i-1]*i)%mod;
for(i=1; i<=n; i++)
for(j=1; j<=k; j++)
f>>a[i][j];
bkt(1,0);
ans=(C(s+k,k)-ans+mod)%mod;
ans-=k*s+1;
g<<(ans%mod+mod)%mod;
return 0;
}