Problem p03064 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cassert>
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <deque>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#define FOR(i, k, n) for (int(i) = (k); (i) < (n); ++(i))
#define rep(i, n) FOR(i, 0, n)
#define all(v) begin(v), end(v)
#define debug(x)     // std::cerr<<#x<<": "<<x<<"\n"
#define debug2(x, y) // std::cerr<<#x<<": "<<x<<", "<<#y<<": "<<y<<"\n"
#define debug3(                                                                \
    x, y,                                                                      \
    z) // std::cerr<<#x<<": "<<x<<", "<<#y<<": "<<y<<", "<<#z<<": "<<z<<"\n"

using ll = long long;
using vi = std::vector<int>;
using vvi = std::vector<vi>;
using vll = std::vector<ll>;
using vvll = std::vector<vll>;
template <typename T> using vvec = std::vector<std::vector<T>>;
template <typename T> auto make_v(size_t sz) { return std::vector<T>(sz); }
template <typename T, typename... Ts> auto make_v(size_t sz, Ts... ts) {
  return std::vector<decltype(make_v<T>(ts...))>(sz, make_v<T>(ts...));
}
template <typename T> void fill_v(T &var, const T &x) { var = x; }
template <typename V, typename T> void fill_v(V &v, const T &x) {
  for (auto &&w : v) {
    fill_v(w, x);
  }
}

template <typename T>
std::ostream &operator<<(std::ostream &s, const std::vector<T> &v) {
  int sz = v.size();
  s << "\n";
  rep(i, sz) {
    s << v[i];
    if (i < sz - 1) {
      s << "\t";
    }
  }
  s << "\n";
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s,
                         const std::vector<std::vector<T>> &v) {
  for (auto &&w : v) {
    s << w;
  }
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s, const std::deque<T> &v) {
  int sz = v.size();
  s << "\n";
  rep(i, sz) {
    s << v[i];
    if (i < sz - 1) {
      s << "\t";
    }
  }
  s << "\n";
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s, const std::deque<std::deque<T>> &v) {
  for (auto &&w : v) {
    s << w;
  }
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s, const std::set<T> &v) {
  s << "\n";
  for (auto &&elm : v) {
    s << elm << "\t";
  }
  s << "\n";
  return s;
}

inline void scan(int &a) { scanf("%d", &a); }
inline void scan(ll &a) { scanf("%lld", &a); }
inline void scan(char &a) { scanf(" %c", &a); }
inline void scan(double &a) { scanf("%lf", &a); }
inline void scan(std::string &s) {
  char BUF[3000000];
  scanf(" %s", BUF);
  s = std::string(BUF);
}
template <typename T> inline void scan(std::vector<T> &v) {
  for (auto &&sv : v) {
    scan(sv);
  }
}
template <typename First, typename... Args>
inline void scan(First &f, Args &...args) {
  scan(f);
  scan(args...);
}
inline void print(int a) { printf("%d\n", a); }
inline void print(ll a) { printf("%lld\n", a); }
inline void print(double a) { printf("%.12f\n", a); }
inline void print(std::string s) { std::cout << s << "\n"; }

using namespace std;

void test() {
  int m = 50;
  int mm = m * (m + 1) / 2 + 10;
  vi a(m);
  rep(i, m) { a[i] = i + 1; }
  vvll dp(m + 1, vll(mm, 0));
  dp[0][0] = 1;
  rep(i, m) {
    dp[i + 1] = dp[i];
    rep(j, mm) {
      if (j + a[i] >= mm) {
        break;
      }
      dp[i + 1][j + a[i]] += dp[i][j];
    }
  }
  debug(dp[m]);
}

int mod = 998244353;
int main() {
  int n;
  scan(n);
  vi a(n);
  scan(a);
  int sum_all = 0;
  rep(i, n) { sum_all += a[i]; }
  vvll dp(n + 1, vll(sum_all + 1, 0));
  dp[0][0] = 1;
  rep(i, n) {
    rep(j, sum_all + 1) { dp[i + 1][j] = dp[i][j] * 2 % mod; }
    rep(j, sum_all + 1) {
      int j2 = j + a[i];
      if (j2 > sum_all) {
        break;
      }
      dp[i + 1][j2] = (dp[i + 1][j2] + dp[i][j]) % mod;
    }
  }
  ll ans = 1;
  rep(i, n) { ans = ans * 3 % mod; }

  int sum_half = (sum_all + 1) / 2;
  FOR(i, sum_half, sum_all + 1) { ans = (ans + (mod - dp[n][i]) * 3) % mod; }
  // debug(dp);

  if (sum_all % 2 == 0) {
    vvll dp2(n + 1, vll(sum_half + 1, 0));
    dp2[0][0] = 1;
    rep(i, n) {
      dp2[i + 1] = dp2[i];
      rep(j, sum_half + 1) {
        int j2 = j + a[i];
        if (j2 > sum_half) {
          break;
        }
        dp2[i + 1][j2] = (dp2[i + 1][j2] + dp2[i][j]) % mod;
      }
    }
    // debug(dp2);
    ll target = dp2[n][sum_half] * 3;
    ans = (ans + target) % mod;
  }

  assert(ans > 0);
  print(ans);

  return 0;
}


Fixed submission:
#include <algorithm>
#include <cassert>
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <deque>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#define FOR(i, k, n) for (int(i) = (k); (i) < (n); ++(i))
#define rep(i, n) FOR(i, 0, n)
#define all(v) begin(v), end(v)
#define debug(x)     // std::cerr<<#x<<": "<<x<<"\n"
#define debug2(x, y) // std::cerr<<#x<<": "<<x<<", "<<#y<<": "<<y<<"\n"
#define debug3(                                                                \
    x, y,                                                                      \
    z) // std::cerr<<#x<<": "<<x<<", "<<#y<<": "<<y<<", "<<#z<<": "<<z<<"\n"

using ll = long long;
using vi = std::vector<int>;
using vvi = std::vector<vi>;
using vll = std::vector<ll>;
using vvll = std::vector<vll>;
template <typename T> using vvec = std::vector<std::vector<T>>;
template <typename T> auto make_v(size_t sz) { return std::vector<T>(sz); }
template <typename T, typename... Ts> auto make_v(size_t sz, Ts... ts) {
  return std::vector<decltype(make_v<T>(ts...))>(sz, make_v<T>(ts...));
}
template <typename T> void fill_v(T &var, const T &x) { var = x; }
template <typename V, typename T> void fill_v(V &v, const T &x) {
  for (auto &&w : v) {
    fill_v(w, x);
  }
}

template <typename T>
std::ostream &operator<<(std::ostream &s, const std::vector<T> &v) {
  int sz = v.size();
  s << "\n";
  rep(i, sz) {
    s << v[i];
    if (i < sz - 1) {
      s << "\t";
    }
  }
  s << "\n";
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s,
                         const std::vector<std::vector<T>> &v) {
  for (auto &&w : v) {
    s << w;
  }
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s, const std::deque<T> &v) {
  int sz = v.size();
  s << "\n";
  rep(i, sz) {
    s << v[i];
    if (i < sz - 1) {
      s << "\t";
    }
  }
  s << "\n";
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s, const std::deque<std::deque<T>> &v) {
  for (auto &&w : v) {
    s << w;
  }
  return s;
}
template <typename T>
std::ostream &operator<<(std::ostream &s, const std::set<T> &v) {
  s << "\n";
  for (auto &&elm : v) {
    s << elm << "\t";
  }
  s << "\n";
  return s;
}

inline void scan(int &a) { scanf("%d", &a); }
inline void scan(ll &a) { scanf("%lld", &a); }
inline void scan(char &a) { scanf(" %c", &a); }
inline void scan(double &a) { scanf("%lf", &a); }
inline void scan(std::string &s) {
  char BUF[3000000];
  scanf(" %s", BUF);
  s = std::string(BUF);
}
template <typename T> inline void scan(std::vector<T> &v) {
  for (auto &&sv : v) {
    scan(sv);
  }
}
template <typename First, typename... Args>
inline void scan(First &f, Args &...args) {
  scan(f);
  scan(args...);
}
inline void print(int a) { printf("%d\n", a); }
inline void print(ll a) { printf("%lld\n", a); }
inline void print(double a) { printf("%.12f\n", a); }
inline void print(std::string s) { std::cout << s << "\n"; }

using namespace std;

void test() {
  int m = 50;
  int mm = m * (m + 1) / 2 + 10;
  vi a(m);
  rep(i, m) { a[i] = i + 1; }
  vvll dp(m + 1, vll(mm, 0));
  dp[0][0] = 1;
  rep(i, m) {
    dp[i + 1] = dp[i];
    rep(j, mm) {
      if (j + a[i] >= mm) {
        break;
      }
      dp[i + 1][j + a[i]] += dp[i][j];
    }
  }
  debug(dp[m]);
}

int mod = 998244353;
int main() {
  int n;
  scan(n);
  vi a(n);
  scan(a);
  int sum_all = 0;
  rep(i, n) { sum_all += a[i]; }
  vvll dp(n + 1, vll(sum_all + 1, 0));
  dp[0][0] = 1;
  rep(i, n) {
    rep(j, sum_all + 1) { dp[i + 1][j] = dp[i][j] * 2 % mod; }
    rep(j, sum_all + 1) {
      int j2 = j + a[i];
      if (j2 > sum_all) {
        break;
      }
      dp[i + 1][j2] = (dp[i + 1][j2] + dp[i][j]) % mod;
    }
  }
  ll ans = 1;
  rep(i, n) { ans = ans * 3 % mod; }

  int sum_half = (sum_all + 1) / 2;
  FOR(i, sum_half, sum_all + 1) { ans = (ans + (mod - dp[n][i]) * 3) % mod; }
  // debug(dp);

  if (sum_all % 2 == 0) {
    vvll dp2(n + 1, vll(sum_half + 1, 0));
    dp2[0][0] = 1;
    rep(i, n) {
      dp2[i + 1] = dp2[i];
      rep(j, sum_half + 1) {
        int j2 = j + a[i];
        if (j2 > sum_half) {
          break;
        }
        dp2[i + 1][j2] = (dp2[i + 1][j2] + dp2[i][j]) % mod;
      }
    }
    // debug(dp2);
    ll target = dp2[n][sum_half] * 3;
    ans = (ans + target) % mod;
  }

  assert(ans >= 0);
  print(ans);

  return 0;
}