Pagini recente » Cod sursa (job #2781213) | Cod sursa (job #3169115) | Cod sursa (job #2593057) | Cod sursa (job #2131778) | Cod sursa (job #3155432)
#include <bits/stdc++.h>
using namespace std;
signed main() {
freopen("cowfood.in", "r", stdin);
freopen("cowfood.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
const int mod = 3210121;
int k, s, n;
cin >> k >> s >> n;
vector<vector<int>> a(n + 1, vector<int>(k + 1));
vector<vector<int>> v(n + 1, vector<int>(k + 1));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= k; j++)
cin >> a[i][j];
vector<vector<int>> dp(s + 2, vector<int>(k + 2));
for (int i = 0; i <= k + 1; i++)
dp[0][i] = 1;
for (int i = 1; i <= s + 1; i++)
for (int j = 0; j <= k + 1; j++)
if (j == 0 || j == 1)
dp[i][j] = 1;
else {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
if (dp[i][j] >= mod)
dp[i][j] -= mod;
}
for (int i = 1; i <= s + 1; i++)
for (int j = 1; j <= k + 1; j++) {
dp[i][j] += dp[i - 1][j];
if (dp[i][j] >= mod)
dp[i][j] -= mod;
}
int val = 0;
// backtracking unde retin ultimul care este inclus pana acum si cati sunt inclusi
function<void(int, int, int)> bkt = [&](int step, int lst, int cnt) {
if (step == n + 1) {
int sum = 0;
if (cnt) {
for (int i = 1; i <= k; i++)
sum += v[lst][i];
if (cnt % 2)
val += dp[s - sum][k];
else
val -= dp[s - sum][k];
if (val >= mod)
val -= mod;
if (val < 0)
val += mod;
if (val < 0)
val += mod;
}
} else {
long long sum = 0;
for (int i = 1; i <= k; i++)
v[step][i] = 0;
bkt(step + 1, lst, cnt);
for (int i = 1; i <= k; i++) {
sum += (v[step][i] = max(v[lst][i], a[step][i]));
if (sum > s)
return;
}
bkt(step + 1, step, cnt + 1);
}
};
bkt(1, 0, 0);
int ans = 0;
if (k <= s)
ans = dp[s][k];
ans -= val + s * k + 1;
ans %= mod;
if (ans < 0)
ans += mod;
cout << ans;
return 0;
}