Pagini recente » Cod sursa (job #2244019) | Cod sursa (job #872752) | Cod sursa (job #1619933) | Cod sursa (job #3031831) | Cod sursa (job #2865432)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("cowfood.in");
ofstream fout ("cowfood.out");
const int r = 3210121;
int invexp (int x)
{
int e = r-2, rez = 1;
while (e)
{
if (e & 1)
rez = 1ll * rez * x % r;
x = 1ll * x * x % r;
e = e >> 1;
}
return rez;
}
int f[10501], invf[10501];
int comb (int n, int k)
{
return 1ll * f[n] * invf[n-k] % r * invf[k] % r;
}
int scomb[10501];
void precalc (int n, int k)
{
int i;
f[0] = invf[0] = 1;
for (i = 1; i<=n+k; i++)
{
f[i] = 1ll * f[i-1] * i % r;
invf[i] = invexp (f[i]);
}
scomb[0] = 1;
for (i = 1; i<=n; i++)
scomb[i] = (scomb[i-1] + comb(i+k-1, k-1)) % r;
}
int a[21][31];
int v[21][31];
int S, n, k, nrb, rasp;
void bkt (int it) //it = 1 ... n
{
if (it == n+1)
{
int i, s = 0;
for (i = 1; i<=k; i++)
s = s + v[n][i];
if (s <= S)
{
if (nrb & 1)
rasp = (rasp - scomb[S-s] + r) % r;
else
rasp = (rasp + scomb[S-s]) % r;
}
}
else
{
int i;
for (i = 1; i<=k; i++)
v[it][i] = max (v[it-1][i], a[it][i]);
nrb++;
bkt (it+1);
nrb--;
for (i = 1; i<=k; i++)
v[it][i] = v[it-1][i];
bkt (it+1);
}
}
int main()
{
int i, j;
fin >> k >> S >> n;
for (i = 1; i<=n; i++)
for (j = 1; j<=k; j++)
fin >> a[i][j];
precalc (S, k);
for (i = 1; i<=k; i++)
v[0][i] = 1;
bkt (1);
fout << rasp;
return 0;
}