Cod sursa(job #3155433)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 8 octombrie 2023 12:26:10
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 1.96 kb
#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;
}