Pagini recente » Cod sursa (job #1625812) | Cod sursa (job #1719632) | Cod sursa (job #3264650) | Cod sursa (job #2380246) | Cod sursa (job #2297914)
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define MOD 3210121
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
int k, s, n, ans, a[25][35], dp[35][10100], nr[35][10100], v[35];
set <vector <int> > h;
vector <int> g;
void back(int lvl, int cnt, int p) {
if (lvl == n) {
int cur = 0;
for (int i = 1; i <= k; i++)
cur += v[i];
cur = s - cur;
if (cnt == 0 || cur < 0)
return;
if (cnt % 2)
ans += nr[k][cur] - p;
else ans -= nr[k][cur] - p;
ans = (ans + 10 * MOD) % MOD;
return;
}
int aux[35], f = 0, l = 0;
for (int i = 1; i <= k; i++) {
aux[i] = v[i];
f += (a[lvl][i] >= v[i]);
l += (a[lvl][i] > v[i]);
v[i] = max(v[i], a[lvl][i]);
}
back(lvl + 1, cnt + 1, p || (f == k || (l == 0 && p == 1)));
for (int i = 1; i <= k; i++)
v[i] = aux[i];
back(lvl + 1, cnt, p);
}
int main() {
in >> k >> s >> n;
for (int i = 0; i < n; i++)
for (int j = 1; j <= k; j++)
in >> a[i][j];
for (int i = 2; i <= s; i++)
dp[2][i] = (dp[2][i - 1] + i - 1) % MOD;
for (int i = 3; i <= k; i++) {
for (int j = 2; j <= s; j++)
dp[i][j] = (dp[i][j] + dp[i - 1][j] + (i - 1) * (j - 1)) % MOD;
for (int j = 2; j <= s; j++)
dp[i][j] = (dp[i][j] + dp[i][j - 1]) % MOD;
}
for (int i = 0; i <= s; i++)
nr[1][i] = 1;
for (int i = 1; i <= s; i++)
nr[1][i] += nr[1][i - 1];
for (int i = 2; i <= k; i++) {
for (int j = 0; j <= s; j++)
nr[i][j] = nr[i - 1][j];
for (int j = 1; j <= s; j++)
nr[i][j] = (nr[i][j] + nr[i][j - 1]) % MOD;
}
for (int i = 0; i < n; i++) {
g.clear();
for (int j = 1; j <= k; j++)
g.push_back(a[i][j]);
h.insert(g);
}
back(0, 0, 0);
out << (dp[k][s] - h.size() - ans + 10 * MOD) % MOD;
return 0;
}