Problem p02965 (C++)

Buggy submission (status: Runtime Error):
#define DEBUG 0

#include <bits/stdc++.h>
using namespace std;

#if DEBUG
// basic debugging macros
int __i__, __j__;
#define printLine(l)                                                           \
  for (__i__ = 0; __i__ < l; __i__++) {                                        \
    cout << "-";                                                               \
  }                                                                            \
  cout << endl
#define printLine2(l, c)                                                       \
  for (__i__ = 0; __i__ < l; __i__++) {                                        \
    cout << c;                                                                 \
  }                                                                            \
  cout << endl
#define printVar(n) cout << #n << ": " << n << endl
#define printArr(a, l)                                                         \
  cout << #a << ": ";                                                          \
  for (__i__ = 0; __i__ < l; __i__++) {                                        \
    cout << a[__i__] << " ";                                                   \
  }                                                                            \
  cout << endl
#define print2dArr(a, r, c)                                                    \
  cout << #a << ":\n";                                                         \
  for (__i__ = 0; __i__ < r; __i__++) {                                        \
    for (__j__ = 0; __j__ < c; __j__++) {                                      \
      cout << a[__i__][__j__] << " ";                                          \
    }                                                                          \
    cout << endl;                                                              \
  }
#define print2dArr2(a, r, c, l)                                                \
  cout << #a << ":\n";                                                         \
  for (__i__ = 0; __i__ < r; __i__++) {                                        \
    for (__j__ = 0; __j__ < c; __j__++) {                                      \
      cout << setw(l) << setfill(' ') << a[__i__][__j__] << " ";               \
    }                                                                          \
    cout << endl;                                                              \
  }

// advanced debugging class
// debug 1,2,'A',"test";
class _Debug {
public:
  template <typename T> _Debug &operator,(T val) {
    cout << val << endl;
    return *this;
  }
};
#define debug _Debug(),
#else
#define printLine(l)
#define printLine2(l, c)
#define printVar(n)
#define printArr(a, l)
#define print2dArr(a, r, c)
#define print2dArr2(a, r, c, l)
#define debug
#endif

// define
#define MAX_VAL 999999999
#define MAX_VAL_2 999999999999999999LL
#define EPS 1e-6
#define mp make_pair
#define pb push_back

// typedef
typedef unsigned int UI;
typedef long long int LLI;
typedef unsigned long long int ULLI;
typedef unsigned short int US;
typedef pair<int, int> pii;
typedef pair<LLI, LLI> plli;
typedef vector<int> vi;
typedef vector<LLI> vlli;
typedef vector<pii> vpii;
typedef vector<plli> vplli;

// ---------- END OF TEMPLATE ----------
#define MOD 998244353

int inv(LLI n) {
  int e = MOD - 2;
  LLI r = 1;
  while (e > 0) {
    if (e & 1)
      r *= n, r %= MOD;
    e >>= 1;
    n *= n, n %= MOD;
  }
  return r;
}
int fact[3000000];
int invfact[3000000];
int choose(int n, int k) {
  return ((((LLI)fact[n] * invfact[k]) % MOD) * invfact[n - k]) % MOD;
}
int main() {
  int i;
  int N, M;
  cin >> N >> M;

  fact[0] = 1;
  for (i = 1; i < 3000000; i++)
    fact[i] = ((LLI)fact[i - 1] * i) % MOD;
  invfact[2999999] = inv(fact[2999999]);
  for (i = 2999998; i >= 0; i--)
    invfact[i] = ((LLI)invfact[i + 1] * (i + 1)) % MOD;
  LLI ans = choose(3 * M + N - 1, N - 1);
  for (i = 2 * M + 1; i <= 3 * M; i++)
    ans -= ((LLI)N * choose(3 * M - i + N - 2, N - 2)) % MOD;
  for (i = M + 1; i <= N; i++) {
    if (!((3 * M - i) & 1))
      ans -= ((LLI)choose(N, i) * choose((3 * M - i) / 2 + N - 1, N - 1)) % MOD;
  }
  ans %= MOD;
  if (ans < 0)
    ans += MOD;
  cout << ans << endl;

  return 0;
}


Fixed submission:
#define DEBUG 0

#include <bits/stdc++.h>
using namespace std;

#if DEBUG
// basic debugging macros
int __i__, __j__;
#define printLine(l)                                                           \
  for (__i__ = 0; __i__ < l; __i__++) {                                        \
    cout << "-";                                                               \
  }                                                                            \
  cout << endl
#define printLine2(l, c)                                                       \
  for (__i__ = 0; __i__ < l; __i__++) {                                        \
    cout << c;                                                                 \
  }                                                                            \
  cout << endl
#define printVar(n) cout << #n << ": " << n << endl
#define printArr(a, l)                                                         \
  cout << #a << ": ";                                                          \
  for (__i__ = 0; __i__ < l; __i__++) {                                        \
    cout << a[__i__] << " ";                                                   \
  }                                                                            \
  cout << endl
#define print2dArr(a, r, c)                                                    \
  cout << #a << ":\n";                                                         \
  for (__i__ = 0; __i__ < r; __i__++) {                                        \
    for (__j__ = 0; __j__ < c; __j__++) {                                      \
      cout << a[__i__][__j__] << " ";                                          \
    }                                                                          \
    cout << endl;                                                              \
  }
#define print2dArr2(a, r, c, l)                                                \
  cout << #a << ":\n";                                                         \
  for (__i__ = 0; __i__ < r; __i__++) {                                        \
    for (__j__ = 0; __j__ < c; __j__++) {                                      \
      cout << setw(l) << setfill(' ') << a[__i__][__j__] << " ";               \
    }                                                                          \
    cout << endl;                                                              \
  }

// advanced debugging class
// debug 1,2,'A',"test";
class _Debug {
public:
  template <typename T> _Debug &operator,(T val) {
    cout << val << endl;
    return *this;
  }
};
#define debug _Debug(),
#else
#define printLine(l)
#define printLine2(l, c)
#define printVar(n)
#define printArr(a, l)
#define print2dArr(a, r, c)
#define print2dArr2(a, r, c, l)
#define debug
#endif

// define
#define MAX_VAL 999999999
#define MAX_VAL_2 999999999999999999LL
#define EPS 1e-6
#define mp make_pair
#define pb push_back

// typedef
typedef unsigned int UI;
typedef long long int LLI;
typedef unsigned long long int ULLI;
typedef unsigned short int US;
typedef pair<int, int> pii;
typedef pair<LLI, LLI> plli;
typedef vector<int> vi;
typedef vector<LLI> vlli;
typedef vector<pii> vpii;
typedef vector<plli> vplli;

// ---------- END OF TEMPLATE ----------
#define MOD 998244353

int inv(LLI n) {
  int e = MOD - 2;
  LLI r = 1;
  while (e > 0) {
    if (e & 1)
      r *= n, r %= MOD;
    e >>= 1;
    n *= n, n %= MOD;
  }
  return r;
}
int fact[3000000];
int invfact[3000000];
int choose(int n, int k) {
  return ((((LLI)fact[n] * invfact[k]) % MOD) * invfact[n - k]) % MOD;
}
int main() {
  int i;
  int N, M;
  cin >> N >> M;

  fact[0] = 1;
  for (i = 1; i < 3000000; i++)
    fact[i] = ((LLI)fact[i - 1] * i) % MOD;
  invfact[2999999] = inv(fact[2999999]);
  for (i = 2999998; i >= 0; i--)
    invfact[i] = ((LLI)invfact[i + 1] * (i + 1)) % MOD;
  LLI ans = choose(3 * M + N - 1, N - 1);
  for (i = 2 * M + 1; i <= 3 * M; i++)
    ans -= ((LLI)N * choose(3 * M - i + N - 2, N - 2)) % MOD;
  for (i = M + 1; i <= min(N, 3 * M); i++) {
    if (!((3 * M - i) & 1))
      ans -= ((LLI)choose(N, i) * choose((3 * M - i) / 2 + N - 1, N - 1)) % MOD;
  }
  ans %= MOD;
  if (ans < 0)
    ans += MOD;
  cout << ans << endl;

  return 0;
}