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

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key

typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<ll, null_type, less<ll>, rb_tree_tag,
             tree_order_statistics_node_update>
    pbds;

vector<int> fact;
vector<int> ifact;
vector<int> inv;
vector<int> pow2;
const int MOD = 998244353;
int add(int a, int b) {
  a += b;
  while (a >= MOD)
    a -= MOD;
  return a;
}
void radd(int &a, int b) { a = add(a, b); }
int mult(int a, int b) { return (a * 1LL * b) % MOD; }
void rmult(int &a, int b) { a = mult(a, b); }
int modpow(int a, int b) {
  int r = 1;
  while (b) {
    if (b & 1)
      r = mult(r, a);
    a = mult(a, a);
    b >>= 1;
  }
  return r;
}
int choose(int a, int b) {
  if (a < b)
    return 0;
  if (b == 0)
    return 1;
  if (a == b)
    return 1;
  return mult(fact[a], mult(ifact[b], ifact[a - b]));
}
int inverse(int a) { return modpow(a, MOD - 2); }
void init(int _n) {
  fact.clear();
  ifact.clear();
  inv.clear();
  pow2.clear();
  fact.resize(_n + 1);
  ifact.resize(_n + 1);
  inv.resize(_n + 1);
  pow2.resize(_n + 1);
  pow2[0] = 1;
  ifact[0] = 1;
  fact[0] = 1;
  for (int i = 1; i <= _n; i++) {
    pow2[i] = add(pow2[i - 1], pow2[i - 1]);
    fact[i] = mult(fact[i - 1], i);
    // ifact[i]=mult(ifact[i-1],inv[i]);
  }
  ifact[_n] = inverse(fact[_n]);
  for (int i = _n - 1; i >= 1; i--) {
    ifact[i] = mult(ifact[i + 1], i + 1);
  }
  for (int i = 1; i <= _n; i++) {
    inv[i] = mult(fact[i - 1], ifact[i]);
  }
}

int dp[333][333][333];
int pref[333];
int a[333];

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  init(11111);
  string s;
  int m;
  cin >> s >> m;
  m = min(m, int(s.length()));
  int cnt = 0;
  for (int i = 0; i < s.length(); i++) {
    if (s[i] == '0')
      cnt++;
    else
      a[cnt]++;
  }
  int n = cnt;
  int ones = int(s.length()) - cnt;
  for (int i = 0; i <= n; i++) {
    pref[i] = a[i];
    if (i)
      pref[i] += pref[i - 1];
  }
  assert(ones == pref[n]);
  // cerr<<"N = "<<n<<'\\n';
  int ans = 0;
  dp[0][0][0] = 1;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= ones; j++) {
      for (int k = 0; k <= ones; k++) {
        if (dp[i][j][k] == 0)
          continue;
        int v = dp[i][j][k];
        // cerr<<i<<' '<<j<<' '<<k<<": "<<max(0,pref[i]-j)<<' '<<ones-j<<'\\n';
        for (int l = ones - j; l >= max(0, pref[i] - j); l--) {
          radd(dp[i + 1][j + l][k + min(a[i], l)], v);
          // cerr<<"NEW "<<i+1<<' '<<j+l<<' '<<k+min(a[i],l)<<'\\n';
        }
      }
    }
  }
  for (int i = max(0, ones - m); i <= ones; i++) {
    // cerr<<n+1<<' '<<ones<<' '<<i<<' '<<dp[n+1][ones][i]<<'\\n';
    radd(ans, dp[n + 1][ones][i]);
  }
  cout << ans << '\\n';
}


Error: -11

Fixed submission:

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key

typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<ll, null_type, less<ll>, rb_tree_tag,
             tree_order_statistics_node_update>
    pbds;

vector<int> fact;
vector<int> ifact;
vector<int> inv;
vector<int> pow2;
const int MOD = 998244353;
int add(int a, int b) {
  a += b;
  while (a >= MOD)
    a -= MOD;
  return a;
}
void radd(int &a, int b) { a = add(a, b); }
int mult(int a, int b) { return (a * 1LL * b) % MOD; }
void rmult(int &a, int b) { a = mult(a, b); }
int modpow(int a, int b) {
  int r = 1;
  while (b) {
    if (b & 1)
      r = mult(r, a);
    a = mult(a, a);
    b >>= 1;
  }
  return r;
}
int choose(int a, int b) {
  if (a < b)
    return 0;
  if (b == 0)
    return 1;
  if (a == b)
    return 1;
  return mult(fact[a], mult(ifact[b], ifact[a - b]));
}
int inverse(int a) { return modpow(a, MOD - 2); }
void init(int _n) {
  fact.clear();
  ifact.clear();
  inv.clear();
  pow2.clear();
  fact.resize(_n + 1);
  ifact.resize(_n + 1);
  inv.resize(_n + 1);
  pow2.resize(_n + 1);
  pow2[0] = 1;
  ifact[0] = 1;
  fact[0] = 1;
  for (int i = 1; i <= _n; i++) {
    pow2[i] = add(pow2[i - 1], pow2[i - 1]);
    fact[i] = mult(fact[i - 1], i);
    // ifact[i]=mult(ifact[i-1],inv[i]);
  }
  ifact[_n] = inverse(fact[_n]);
  for (int i = _n - 1; i >= 1; i--) {
    ifact[i] = mult(ifact[i + 1], i + 1);
  }
  for (int i = 1; i <= _n; i++) {
    inv[i] = mult(fact[i - 1], ifact[i]);
  }
}

int dp[333][333][333];
int pref[333];
int a[333];

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  init(11111);
  string s;
  int m;
  cin >> s >> m;
  int cnt = 0;
  for (int i = 0; i < s.length(); i++) {
    if (s[i] == '0')
      cnt++;
    else
      a[cnt]++;
  }
  int n = cnt;
  int ones = int(s.length()) - cnt;
  for (int i = 0; i <= n; i++) {
    pref[i] = a[i];
    if (i)
      pref[i] += pref[i - 1];
  }
  assert(ones == pref[n]);
  // cerr<<"N = "<<n<<'\\n';
  int ans = 0;
  dp[0][0][0] = 1;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= ones; j++) {
      for (int k = 0; k <= ones; k++) {
        if (dp[i][j][k] == 0)
          continue;
        int v = dp[i][j][k];
        // cerr<<i<<' '<<j<<' '<<k<<": "<<max(0,pref[i]-j)<<' '<<ones-j<<'\\n';
        for (int l = ones - j; l >= max(0, pref[i] - j); l--) {
          radd(dp[i + 1][j + l][k + min(a[i], l)], v);
          // cerr<<"NEW "<<i+1<<' '<<j+l<<' '<<k+min(a[i],l)<<'\\n';
        }
      }
    }
  }
  for (int i = ones - m; i <= ones; i++) {
    cerr << n + 1 << ' ' << ones << ' ' << i << ' ' << dp[n + 1][ones][i]
         << '\\n';
    radd(ans, dp[n + 1][ones][i]);
  }
  cout << ans << '\\n';
}