Pagini recente » Cod sursa (job #111295) | Cod sursa (job #551376) | Cod sursa (job #373530) | Cod sursa (job #2216676) | Cod sursa (job #986446)
Cod sursa(job #986446)
#include <fstream>
#define mod 3210121
#define maxs 10030
#define ll long long
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int k,s,n;
int f[maxs],crs[maxs];
int m[31][21],temp[21];
ll x,nkinv,kinv,NK,K,N,t,S;
void inverse (ll a, ll b, ll &x, ll &y)
{
if (b==0)
{
x=1;
y=0;
return;
}
ll xp,yp;
inverse (b,a%b,xp,yp);
x = yp;
y = xp - yp*(a/b);
}
int subsets ()
{
S=0;
t = (1<<n)-1;
for (int i=1; i<=t; ++i)
{
int nr=0;
for (int j=0; j<n; j++)
{
if ((i>>j)&1)
{
++nr;
for (int h=1; h<=k; ++h)
temp[h] = max (temp[h],m[j+1][h]);
}
}
int ts=0;
for (int h=1; h<=k; ++h) ts+=temp[h];
ts=s-ts;
if (ts>=0)
{
if (nr&1) S= (S+crs[ts]) %mod;
else S= (S - crs[ts]) %mod;
}
for (int h=1; h<=k; ++h) temp[h]=0;
}
}
int main()
{
fin>>k>>s>>n;
for (int i=1 ; i<=n; ++i)
for (int j=1; j<=k; ++j)
fin>>m[i][j];
f[0]=1;
for (int i=1; i<=s+k; ++i) f[i] = f[i-1]*i % mod;
crs[0]=1;
NK = f[k-1];
inverse (mod,NK,x,nkinv);
while (nkinv<0) nkinv += mod;
for (int i=1; i<=s; ++i)
{
N = f[i+k-1];
K = f[i];
inverse (mod,K,x,kinv);
while (kinv<0) kinv += mod;
crs[i]=crs[i-1]+N*kinv*nkinv%mod;
}
subsets ();
fout<<(crs[s]-S-k*s-1)%mod;
}