Problem p02635 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
#define int long long
#define ll long long
using ull = unsigned long long;
using namespace std;
#define dump(x)                                                                \\
  if (dbg) {                                                                   \\
    cerr << #x << " = " << (x) << endl;                                        \\
  }
#define overload4(_1, _2, _3, _4, name, ...) name
#define FOR1(n) for (ll i = 0; i < (n); ++i)
#define FOR2(i, n) for (ll i = 0; i < (n); ++i)
#define FOR3(i, a, b) for (ll i = (a); i < (b); ++i)
#define FOR4(i, a, b, c) for (ll i = (a); i < (b); i += (c))
#define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__)
#define FORR(i, a, b) for (int i = (a); i <= (b); ++i)
#define bit(n, k) ((n >> k) & 1) /*nのk bit目*/
namespace mydef {
const int INF = 1ll << 60;
const int MOD = 998244353;
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  } else
    return 0;
}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  } else
    return 0;
}
void Yes(bool flag = true) {
  if (flag)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}
void No(bool flag = true) { Yes(!flag); }
void YES(bool flag = true) {
  if (flag)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}
void NO(bool flag = true) { YES(!flag); }
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}
bool dbg = false;
} // namespace mydef
using namespace mydef;
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(), (v).end()
#define SZ(x) ((int)(x).size())
#define vi vector<int>
#define vvi vector<vector<int>>
#define vp vector<pair<int, int>>
#define vvp vector<vector<pair<int, int>>>
#define pi pair<int, int>
// #define P pair<int, int>
// #define V vector<int>
// #define S set<int>
#define asn ans
template <uint MD> struct ModInt {
  using M = ModInt;
  const static M G;
  uint v;
  ModInt(ll _v = 0) { set_v(_v % MD + MD); }
  M &set_v(uint _v) {
    v = (_v < MD) ? _v : _v - MD;
    return *this;
  }
  explicit operator bool() const { return v != 0; }
  M operator-() const { return M() - *this; }
  M operator+(const M &r) const { return M().set_v(v + r.v); }
  M operator-(const M &r) const { return M().set_v(v + MD - r.v); }
  M operator*(const M &r) const { return M().set_v(ull(v) * r.v % MD); }
  M operator/(const M &r) const { return *this * r.inv(); }
  M &operator+=(const M &r) { return *this = *this + r; }
  M &operator-=(const M &r) { return *this = *this - r; }
  M &operator*=(const M &r) { return *this = *this * r; }
  M &operator/=(const M &r) { return *this = *this / r; }
  bool operator==(const M &r) const { return v == r.v; }
  M pow(ll n) const {
    M x = *this, r = 1;
    while (n) {
      if (n & 1)
        r *= x;
      x *= x;
      n >>= 1;
    }
    return r;
  }
  M inv() const { return pow(MD - 2); }
  friend ostream &operator<<(ostream &os, const M &r) { return os << r.v; }
  friend istream &operator>>(istream &is, M &r) { return is >> r.v; }
};
using Mint = ModInt<MOD>;
const int MN = 1000000;
Mint fact[MN], iFac[MN];
void first() {
  fact[0] = Mint(1);
  for (int i = 1; i < MN; i++)
    fact[i] = fact[i - 1] * Mint(i);
  iFac[MN - 1] = fact[MN - 1].inv();
  for (int i = MN - 1; i >= 1; i--) {
    iFac[i - 1] = iFac[i] * Mint(i);
  }
  assert(fact[2345] * iFac[2345] == Mint(1));
}
Mint C(int n, int k) {
  if (n < k || k < 0)
    return Mint(0);
  return fact[n] * iFac[k] * iFac[n - k];
}

string S;
vi s;
int K;
int mp[333];

Mint dp[333][333][333];

void solve() {
  while (S.size() > 0 && S[0] == 1)
    S.erase(S.begin());
  if (S.size() == 0) {
    cout << 1 << endl;
    return;
  }
  int cnt1 = 0;
  for (auto &c : S)
    cnt1 += c;
  chmin(K, cnt1);

  /*
  int tmp = 0;
  for (int i = 0; i < S.size(); i++) {
      if(S[i] == 1){
      }
  }
  */

  s.emplace_back(0);
  {
    int pre = 0;
    for (auto &c : S) {
      if ((int)c == pre) {
        (s.back())++;
      } else {
        pre = !pre;
        s.emplace_back(1);
      }
    }
  }

  int max_0 = 0;

  int now = 0;
  dp[0][0][1] = 1;
  for (int i = 0; i < s.size(); i++) {
    int n = s[i];
    if (now == 1) {
      for (int a = 0; a <= K; a++) {
        for (int m = 0; m <= n; m++) {
          for (int c = max_0; c >= 0; c--) {
            // a:既に動かした1の個数
            // m:動かす1の個数
            // c:行き先の0の個数
            for (int d = 1; d <= c; d++) {
              if (m > 0)
                dp[a + m][i + 1][d] += dp[a][i][c] * C((c - d) + m - 1, m - 1);
            }
            if (m == 0)
              dp[a][i + 1][c] += dp[a][i][c];

            // a:既に動かした1の個数
            // m:動かす1の個数
            // c:行き先の0の個数
            // dp[a + m][i + 1][c] += dp[a][i][c] * C(c + m - 1, m);
          }
        }
      }
    } else {
      max_0 += n;
      // 0の場合
      for (int a = 0; a <= 300; a++) {
        // a:既に動かした1の個数
        for (int c = 0; c <= 300; c++) {
          // c:行き先の0の個数
          dp[a][i + 1][c + (n - 1)] += dp[a][i][c];
          if (i - 1 >= 1) {
            dp[a][i + 1][c + (n - 1)] -= dp[a][i - 1][c];
            dp[a][i + 1][c + n] += dp[a][i - 1][c];
          }
        }
      }
    }
    now ^= 1;
  }

  /*
  for (int j = 0; j < 10; j++) {
      for (int i = 0; i < 10; i++) {
          for (int k = 0; k < 10; k++) {
              cerr << dp[i][j][k] << " ";
          }
          cerr << endl;
      }
      cerr << endl;
  }
  */

  Mint ans = 0;
  for (int i = 0; i <= K; i++) {
    for (int j = 0; j <= 300; j++) {
      ans += dp[i][s.size()][j];
    }
  }

  cout << ans << endl;
}

signed main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  first();

  cin >> S >> K;
  for (auto &c : S)
    c -= '0';

  solve();
  return 0;
}


Error: -11

Fixed submission:

#include <bits/stdc++.h>
#define int long long
#define ll long long
using ull = unsigned long long;
using namespace std;
#define dump(x)                                                                \\
  if (dbg) {                                                                   \\
    cerr << #x << " = " << (x) << endl;                                        \\
  }
#define overload4(_1, _2, _3, _4, name, ...) name
#define FOR1(n) for (ll i = 0; i < (n); ++i)
#define FOR2(i, n) for (ll i = 0; i < (n); ++i)
#define FOR3(i, a, b) for (ll i = (a); i < (b); ++i)
#define FOR4(i, a, b, c) for (ll i = (a); i < (b); i += (c))
#define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__)
#define FORR(i, a, b) for (int i = (a); i <= (b); ++i)
#define bit(n, k) ((n >> k) & 1) /*nのk bit目*/
namespace mydef {
const int INF = 1ll << 60;
const int MOD = 998244353;
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  } else
    return 0;
}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  } else
    return 0;
}
void Yes(bool flag = true) {
  if (flag)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
}
void No(bool flag = true) { Yes(!flag); }
void YES(bool flag = true) {
  if (flag)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}
void NO(bool flag = true) { YES(!flag); }
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}
bool dbg = false;
} // namespace mydef
using namespace mydef;
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(), (v).end()
#define SZ(x) ((int)(x).size())
#define vi vector<int>
#define vvi vector<vector<int>>
#define vp vector<pair<int, int>>
#define vvp vector<vector<pair<int, int>>>
#define pi pair<int, int>
// #define P pair<int, int>
// #define V vector<int>
// #define S set<int>
#define asn ans
template <uint MD> struct ModInt {
  using M = ModInt;
  const static M G;
  uint v;
  ModInt(ll _v = 0) { set_v(_v % MD + MD); }
  M &set_v(uint _v) {
    v = (_v < MD) ? _v : _v - MD;
    return *this;
  }
  explicit operator bool() const { return v != 0; }
  M operator-() const { return M() - *this; }
  M operator+(const M &r) const { return M().set_v(v + r.v); }
  M operator-(const M &r) const { return M().set_v(v + MD - r.v); }
  M operator*(const M &r) const { return M().set_v(ull(v) * r.v % MD); }
  M operator/(const M &r) const { return *this * r.inv(); }
  M &operator+=(const M &r) { return *this = *this + r; }
  M &operator-=(const M &r) { return *this = *this - r; }
  M &operator*=(const M &r) { return *this = *this * r; }
  M &operator/=(const M &r) { return *this = *this / r; }
  bool operator==(const M &r) const { return v == r.v; }
  M pow(ll n) const {
    M x = *this, r = 1;
    while (n) {
      if (n & 1)
        r *= x;
      x *= x;
      n >>= 1;
    }
    return r;
  }
  M inv() const { return pow(MD - 2); }
  friend ostream &operator<<(ostream &os, const M &r) { return os << r.v; }
  friend istream &operator>>(istream &is, M &r) { return is >> r.v; }
};
using Mint = ModInt<MOD>;
const int MN = 1000000;
Mint fact[MN], iFac[MN];
void first() {
  fact[0] = Mint(1);
  for (int i = 1; i < MN; i++)
    fact[i] = fact[i - 1] * Mint(i);
  iFac[MN - 1] = fact[MN - 1].inv();
  for (int i = MN - 1; i >= 1; i--) {
    iFac[i - 1] = iFac[i] * Mint(i);
  }
  assert(fact[2345] * iFac[2345] == Mint(1));
}
Mint C(int n, int k) {
  if (n < k || k < 0)
    return Mint(0);
  return fact[n] * iFac[k] * iFac[n - k];
}

string S;
vi s;
int K;
int mp[333];

Mint dp[333][333][333];

void solve() {
  while (S.size() > 0 && S[0] == 1)
    S.erase(S.begin());
  if (S.size() == 0) {
    cout << 1 << endl;
    return;
  }
  int cnt1 = 0;
  for (auto &c : S)
    cnt1 += c;
  chmin(K, cnt1);

  /*
  int tmp = 0;
  for (int i = 0; i < S.size(); i++) {
      if(S[i] == 1){
      }
  }
  */

  s.emplace_back(0);
  {
    int pre = 0;
    for (auto &c : S) {
      if ((int)c == pre) {
        (s.back())++;
      } else {
        pre = !pre;
        s.emplace_back(1);
      }
    }
  }

  int now = 0;
  dp[0][0][1] = 1;
  for (int i = 0; i < s.size(); i++) {
    int n = s[i];
    if (now == 1) {
      for (int a = 0; a <= 300; a++) {
        for (int m = 0; m <= n; m++) {
          for (int c = 300; c >= 0; c--) {
            // a:既に動かした1の個数
            // m:動かす1の個数(だたのラベリング)
            // c:行き先の0の個数
            for (int d = 1; d <= c; d++) {
              if (m > 0)
                dp[a + m][i + 1][d] += dp[a][i][c] * C((c - d) + m - 1, m - 1);
            }
            if (m == 0)
              dp[a][i + 1][c] += dp[a][i][c];

            // a:既に動かした1の個数
            // m:動かす1の個数
            // c:行き先の0の個数
            // dp[a + m][i + 1][c] += dp[a][i][c] * C(c + m - 1, m);
          }
        }
      }
    } else {
      // 0の場合
      for (int a = 0; a <= 300; a++) {
        // a:既に動かした1の個数
        for (int c = 0; c <= 300; c++) {
          // c:行き先の0の個数
          dp[a][i + 1][c + (n - 1)] += dp[a][i][c];
          if (i - 1 >= 1) {
            dp[a][i + 1][c + (n - 1)] -= dp[a][i - 1][c];
            dp[a][i + 1][c + n] += dp[a][i - 1][c];
          }
        }
      }
    }
    now ^= 1;
  }

  /*
  for (int j = 0; j < 10; j++) {
      for (int i = 0; i < 10; i++) {
          for (int k = 0; k < 10; k++) {
              cerr << dp[i][j][k] << " ";
          }
          cerr << endl;
      }
      cerr << endl;
  }
  */

  Mint ans = 0;
  for (int i = 0; i <= K; i++) {
    for (int j = 0; j <= 300; j++) {
      ans += dp[i][s.size()][j];
    }
  }

  cout << ans << endl;
}

signed main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  first();

  cin >> S >> K;
  for (auto &c : S)
    c -= '0';

  solve();
  return 0;
}