Pagini recente » Cod sursa (job #489935) | Cod sursa (job #214873) | Cod sursa (job #2249254) | Cod sursa (job #1613713) | Cod sursa (job #2338798)
#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;
}
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];
for(int mask=1;mask<(1<<n);mask++)
{
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)
continue;
int auxx=0;
int maskk=mask;
while(maskk)
{
if(maskk&1)
auxx++;
maskk>>=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;
}
}
ans=(C(s+k,k)-ans+mod)%mod;
ans-=k*s+1;
g<<(ans%mod+mod)%mod;
return 0;
}