Problem p02965 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int p = 998244353;
#define int long long
#define vel vector<long long>
#define vvel vector<vel>
#define rep(i, n) for (long long i = 0; i < n; i++)
#define sor(v) sort(v.begin(), v.end())
#define mmax(a, b) a = max(a, b)
#define mmin(a, b) a = min(a, b)
#define mkp make_pair
#define pin pair<int, int>
#define qin pair<pin, int>
#define V vector
#define Endl endl
#define veb vector<bool>
#define sq(a) (a) * (a)
#define rev(s) reverse(s.begin(), s.end())
#define end_pr(s)                                                              \
  cout << s << endl;                                                           \
  return 0
#define itn int
#define bs bitset<5001>

int kai_size = 2600001;
vel kai(kai_size, 1);
vel ink(kai_size, 1);
int RE() {
  vel v(3, 2);
  return v.at(4);
}
int ru(int a, int r) {
  if (r == 0) {
    return 1;
  }
  int ans = ru(a, r / 2);
  ans *= ans;
  ans %= p;
  if (r % 2 == 1) {
    ans *= a;
  }
  return ans % p;
}
int inv(int a) { return ru(a, p - 2); }
void make_kai() {
  rep(i, kai_size - 1) { kai[i + 1] = (kai[i] * (i + 1)) % p; }
  rep(i, 1000001) { ink[i] = inv(kai[i]); }
}
int com(int n, int r) {
  int ans = kai[n] * ink[r];
  ans %= p;
  ans *= ink[n - r];
  ans %= p;
  return ans;
}
vel dis(int mid1, vvel &way) {
  int n = way.size();
  vel dist(n, -1);
  dist[mid1] = 0;
  queue<int> q;
  q.push(mid1);
  while (!q.empty()) {
    int st = q.front();
    q.pop();
    rep(i, way[st].size()) {
      int to = way[st][i];
      if (dist[to] == -1) {
        dist[to] = dist[st] + 1;
        q.push(to);
      }
    }
  }
  return dist;
}
pin most_far(int now, int n, vvel &way) {
  vel dist1 = dis(now, way);
  pin ans = mkp(-1, 0);
  rep(i, n) {
    if (dist1[i] > ans.first) {
      ans = mkp(dist1[i], i);
    }
  }
  return ans;
}

int per(int a, int b) {
  int ans = a % b;
  if (ans < 0) {
    ans += b;
  }
  return ans;
}
V<pin> uni(V<pin> &v) {
  sor(v);
  V<pin> ans(1, v[0]);
  for (int i = 1; i < v.size(); i++) {
    if (v[i] != v[i - 1]) {
      ans.push_back(v[i]);
    }
  }
  v = ans;
  return v;
}
int s_gcd(int a, int b) {
  if (b == 0) {
    return a;
  }
  return s_gcd(b, a % b);
}
int gcd(int a, int b) {
  if (a < b) {
    swap(a, b);
  }
  return s_gcd(a, b);
}
signed main() {
  int n, m;
  cin >> n >> m;
  int sum = 3 * m;
  make_kai();
  int inv1 = inv(kai[sum]);
  int qans = kai[sum + n - 1];
  qans *= ink[n - 1];
  qans %= p;
  qans *= inv1;
  qans %= p;
  int mi1 = 0;
  for (int b = 0; b < m; b++) {
    int plus = com(b + n - 2, n - 2);
    mi1 += plus;
  }
  mi1 %= p;
  mi1 *= n;
  mi1 %= p;
  int mi2 = 0;
  for (int a = m + 2; a <= n; a += 2) {
    int maru = (3 * m) - a;
    maru /= 2;
    int plus = com(maru + n - 1, n - 1);
    int mul = com(n, a);
    plus *= mul;
    plus %= p;
    mi2 += plus;
  }
  mi2 %= p;
  int ans = qans + 2 * p - mi1 - mi2;
  cout << ans % p << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int p = 998244353;
#define int long long
#define vel vector<long long>
#define vvel vector<vel>
#define rep(i, n) for (long long i = 0; i < n; i++)
#define sor(v) sort(v.begin(), v.end())
#define mmax(a, b) a = max(a, b)
#define mmin(a, b) a = min(a, b)
#define mkp make_pair
#define pin pair<int, int>
#define qin pair<pin, int>
#define V vector
#define Endl endl
#define veb vector<bool>
#define sq(a) (a) * (a)
#define rev(s) reverse(s.begin(), s.end())
#define end_pr(s)                                                              \
  cout << s << endl;                                                           \
  return 0
#define itn int
#define bs bitset<5001>

int kai_size = 2600001;
vel kai(kai_size, 1);
vel ink(kai_size, 1);
int RE() {
  vel v(3, 2);
  return v.at(4);
}
int ru(int a, int r) {
  if (r == 0) {
    return 1;
  }
  int ans = ru(a, r / 2);
  ans *= ans;
  ans %= p;
  if (r % 2 == 1) {
    ans *= a;
  }
  return ans % p;
}
int inv(int a) { return ru(a, p - 2); }
void make_kai() {
  rep(i, kai_size - 1) { kai[i + 1] = (kai[i] * (i + 1)) % p; }
  rep(i, 1000001) { ink[i] = inv(kai[i]); }
}
int com(int n, int r) {
  int ans = kai[n] * ink[r];
  ans %= p;
  ans *= ink[n - r];
  ans %= p;
  return ans;
}
vel dis(int mid1, vvel &way) {
  int n = way.size();
  vel dist(n, -1);
  dist[mid1] = 0;
  queue<int> q;
  q.push(mid1);
  while (!q.empty()) {
    int st = q.front();
    q.pop();
    rep(i, way[st].size()) {
      int to = way[st][i];
      if (dist[to] == -1) {
        dist[to] = dist[st] + 1;
        q.push(to);
      }
    }
  }
  return dist;
}
pin most_far(int now, int n, vvel &way) {
  vel dist1 = dis(now, way);
  pin ans = mkp(-1, 0);
  rep(i, n) {
    if (dist1[i] > ans.first) {
      ans = mkp(dist1[i], i);
    }
  }
  return ans;
}

int per(int a, int b) {
  int ans = a % b;
  if (ans < 0) {
    ans += b;
  }
  return ans;
}
V<pin> uni(V<pin> &v) {
  sor(v);
  V<pin> ans(1, v[0]);
  for (int i = 1; i < v.size(); i++) {
    if (v[i] != v[i - 1]) {
      ans.push_back(v[i]);
    }
  }
  v = ans;
  return v;
}
int s_gcd(int a, int b) {
  if (b == 0) {
    return a;
  }
  return s_gcd(b, a % b);
}
int gcd(int a, int b) {
  if (a < b) {
    swap(a, b);
  }
  return s_gcd(a, b);
}
signed main() {
  int n, m;
  cin >> n >> m;
  int sum = 3 * m;
  make_kai();
  int inv1 = inv(kai[sum]);
  int qans = kai[sum + n - 1];
  qans *= ink[n - 1];
  qans %= p;
  qans *= inv1;
  qans %= p;
  int mi1 = 0;
  for (int b = 0; b < m; b++) {
    int plus = com(b + n - 2, n - 2);
    mi1 += plus;
  }
  mi1 %= p;
  mi1 *= n;
  mi1 %= p;
  int mi2 = 0;
  for (int a = m + 2; a <= n; a += 2) {
    int maru = (3 * m) - a;
    maru /= 2;
    if (maru >= 0) {
      int plus = com(maru + n - 1, n - 1);
      int mul = com(n, a);
      plus *= mul;
      plus %= p;
      mi2 += plus;
    }
  }
  mi2 %= p;
  int ans = qans + 2 * p - mi1 - mi2;
  cout << ans % p << endl;
  return 0;
}