Problem p02862 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <complex>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define all(x) (x).begin(), (x).end()

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

typedef long long ll;

using namespace std;
long long modpow(long long x, long long n, long long mod) {
  if (n == 0)
    return 1;
  long long res = modpow(x * x % mod, n / 2, mod);
  if (n & 1)
    res = res * x % mod;
  return res;
}
long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); }
vector<long long> fact, inv;
long long mod = 1e9 + 7;
void init(int n) {
  fact.resize(n);
  inv.resize(n);
  fact[0] = 1LL;
  rep(i, n - 1) { fact[i + 1] = (long long)fact[i] * (i + 1) % mod; }
  inv[n - 1] = modinv(fact[n - 1], mod);
  rrep(i, n - 1) { inv[i] = (long long)inv[i + 1] * (i + 1) % mod; }
}
long long comb(ll a, ll b) { return fact[a] * inv[b] % mod * inv[a - b] % mod; }

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll x, y;
  cin >> x >> y;
  if ((x + y) % 3 != 0) {
    cout << 0 << endl;
    return 0;
  }
  ll a, b;
  a = y - (x + y) / 3;
  b = x - (x + y) / 3;
  //  cout<<a<<" "<<b<<endl;
  init(2e6);
  cout << comb(a + b, a) << endl;

  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <complex>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define all(x) (x).begin(), (x).end()

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

typedef long long ll;

using namespace std;
long long modpow(long long x, long long n, long long mod) {
  if (n == 0)
    return 1;
  long long res = modpow(x * x % mod, n / 2, mod);
  if (n & 1)
    res = res * x % mod;
  return res;
}
long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); }
vector<long long> fact, inv;
long long mod = 1e9 + 7;
void init(int n) {
  fact.resize(n);
  inv.resize(n);
  fact[0] = 1LL;
  rep(i, n - 1) { fact[i + 1] = (long long)fact[i] * (i + 1) % mod; }
  inv[n - 1] = modinv(fact[n - 1], mod);
  rrep(i, n - 1) { inv[i] = (long long)inv[i + 1] * (i + 1) % mod; }
}
long long comb(ll a, ll b) { return fact[a] * inv[b] % mod * inv[a - b] % mod; }

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll x, y;
  cin >> x >> y;
  if ((x + y) % 3 != 0) {
    cout << 0 << endl;
    return 0;
  }
  ll a, b;
  a = y - (x + y) / 3;
  b = x - (x + y) / 3;
  //  cout<<a<<" "<<b<<endl;
  if (a < 0 || b < 0) {
    cout << 0 << endl;
    return 0;
  }
  init(2e6);
  cout << comb(a + b, a) << endl;

  return 0;
}