Pagini recente » Cod sursa (job #1252298) | Cod sursa (job #241743) | Cod sursa (job #2316131) | Cod sursa (job #1870187) | Cod sursa (job #2297468)
#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];
void solve(int mask) {
int cnt = __builtin_popcount(mask);
memset(v, 0, sizeof v);
for (int bit = 0; bit < n; bit++)
if (mask & (1 << bit))
for (int i = 1; i <= k; i++)
v[i] = max(v[i], a[bit][i]);
int cur = 0;
for (int i = 1; i <= k; i++)
cur += v[i];
cur = s - cur;
if (cur <= 0)
return;
if (cnt % 2 == 1)
ans += nr[k][cur] - 1;
else ans -= nr[k][cur] - 1;
ans = (ans + MOD) % MOD;
}
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 = 1; i <= s; i++)
dp[1][i] = 1 + dp[1][i - 1];
for (int i = 2; i <= k; i++) {
for (int j = i; j <= s; j++)
dp[i][j] = dp[i - 1][j - 1];
for (int j = i; 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 mask = 1; mask < (1 << n); mask++)
solve(mask);
out << (dp[k][s] - n - ans + MOD) % MOD;
return 0;
}