Pagini recente » Cod sursa (job #2650960) | Cod sursa (job #101348) | Cod sursa (job #2774867) | Cod sursa (job #676455) | Cod sursa (job #994827)
Cod sursa(job #994827)
#include <fstream>
#define maxs 10040
#define ll long long
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
ll k,s,n;
ll f[maxs],crs[maxs];
ll m[21][31],v[31];
ll x,nkinv,kinv,NK,K,N,S;
ll mod =3210121;
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 (int x, int nr)
{
if (nr!=0)
{
int ts=0;
for (int j=1; j<=k; ++j) ts+=v[j];
ts=(s-ts);
if (ts>=0)
{
if (nr&1) {S -= crs[ts]; if (S<0) S+=mod;}
else {S += crs[ts]; if (S>=mod) S-=mod;}
} }
int temp [31];
for (int i = x+1; i<=n; ++i)
{
for (int j=1; j<=k; ++j)
{
temp[j] = v[j];
v[j] = max (v[j],m[i][j]);
}
subsets (i,nr+1);
for (int j=1; j<=k; ++j) v[j] = temp[j];
}
}
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);
if (nkinv<=0) nkinv = mod + nkinv%mod;
for (int i=1; i<=s; ++i)
{
N = f[i+k-1];
K = f[i];
inverse (mod,K,x,kinv);
if (kinv<=0) kinv = mod + kinv%mod;
crs[i]=crs[i-1]+(((N*kinv)%mod)*nkinv)%mod;
if (crs[i]>=mod) crs[i]-=mod;
}
S += crs[s]-1;
S = (S-s*k)%mod;
subsets (0,0);
fout<<S;
}