Pagini recente » Cod sursa (job #1140701) | Cod sursa (job #1487478) | Cod sursa (job #47162) | Cod sursa (job #3156441) | Cod sursa (job #3219839)
using namespace std;
#ifdef EZ
#include "./ez/ez.h"
const string FILE_NAME = "test";
#else
#include <bits/stdc++.h>
const string FILE_NAME = "cowfood";
#endif
#define mp make_pair
#define ll long long
#define pb push_back
#define fi first
#define se second
#define cin fin
#define cout fout
ifstream fin (FILE_NAME + ".in");
ofstream fout (FILE_NAME + ".out");
const int MOD = 3210121;
int fact[10101];
int factInv[10101];
void euclid(int a, int b, int &x, int &y)
{
if (b == 0) return (void) (x = y = 1);
int x0, y0;
euclid(b, a%b, x0, y0);
x = y0;
y = x0 - a/b*y0;
}
void genFact()
{
fact[0] = factInv[0] = 1;
int tmp;
for (int i = 1; i < 10101; ++i)
{
fact[i] = 1LL * fact[i-1] * i % MOD;
euclid(fact[i], MOD, factInv[i], tmp);
if (factInv[i] < 0) factInv[i] += MOD;
}
}
int comb(int n, int k)
{
return 1LL * fact[n] * factInv[k] % MOD * factInv[n-k] % MOD;
}
// sum_{h=0..lim} comb(k-1+h, h)
int k;
int cool[10101];
void genCool()
{
for (int i = 1; i + k-1 < 10101; ++i)
cool[i] = (cool[i-1] + 1LL * fact[i + k-1 - 1] * factInv[i-1] % MOD) % MOD;
}
int coolComb(int lim)
{
return 1LL * factInv[k-1] * cool[lim+1] % MOD;
}
int main()
{
genFact();
int k, s, n; cin >> k >> s >> n; ::k = k; genCool();
vector<vector<int>> v(n, vector<int>(k));
for (int i = 0; i < n; ++i)
for (int j = 0; j < k; ++j) cin >> v[i][j];
for (int i = 0; i < n; ++i)
{
int lib = 0;
for (int j = 0; j < k; ++j)
if (v[i][j]) lib++;
if (lib <= 1) cout << 0, exit(0);
}
ll ANS = coolComb(s);
ANS -= 1 + s*k;
ANS = (ANS % MOD + MOD) % MOD;
for (int msk = 1; msk < (1<<n); ++msk)
{
vector<int> conf(k);
for (int i = 0; i < n; ++i)
if (msk & 1<<i)
for (int j = 0; j < k; ++j)
conf[j] = max(conf[j], v[i][j]);
int sc = 0;
for (int j = 0; j < k; ++j)
sc += conf[j];
if (sc > s) continue;
ll ans = coolComb(s-sc);
if (__builtin_popcount(msk) & 1)
ANS -= ans;
else
ANS += ans;
ANS = (ANS % MOD + MOD) % MOD;
}
cout << ANS;
}