Problem p02862 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdlib>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

using namespace std;
using Int = long long;
Int INF = 1LL << 60;
const Int MOD = 1000000000 + 7;

template <int Modulo = MOD> struct Mint {
  Int val;
  constexpr Mint(Int v = 0) noexcept : val(v % Modulo) {
    if (val < 0)
      v += Modulo;
  }
  constexpr int getmod() { return Modulo; }
  constexpr Mint operator-() const noexcept { return val ? Modulo - val : 0; }
  constexpr Mint operator+(const Mint &r) const noexcept {
    return Mint(*this) += r;
  }
  constexpr Mint operator-(const Mint &r) const noexcept {
    return Mint(*this) -= r;
  }
  constexpr Mint operator*(const Mint &r) const noexcept {
    return Mint(*this) *= r;
  }
  constexpr Mint operator/(const Mint &r) const noexcept {
    return Mint(*this) /= r;
  }
  constexpr Mint &operator+=(const Mint &r) noexcept {
    val += r.val;
    if (val >= Modulo)
      val -= Modulo;
    return *this;
  }
  constexpr Mint &operator-=(const Mint &r) noexcept {
    val -= r.val;
    if (val < 0)
      val += Modulo;
    return *this;
  }
  constexpr Mint &operator*=(const Mint &r) noexcept {
    val = val * r.val % Modulo;
    return *this;
  }
  constexpr Mint &operator/=(const Mint &r) noexcept {
    Int a = r.val, b = Modulo, u = 1, v = 0;
    while (b) {
      Int t = a / b;
      a -= t * b;
      swap(a, b);
      u -= t * v;
      swap(u, v);
    }
    val = val * u % Modulo;
    if (val < 0)
      val += Modulo;
    return *this;
  }
  constexpr bool operator==(const Mint &r) const noexcept {
    return this->val == r.val;
  }
  constexpr bool operator!=(const Mint &r) const noexcept {
    return this->val != r.val;
  }
  friend ostream &operator<<(ostream &os, const Mint<Modulo> &x) noexcept {
    return os << x.val;
  }
  friend istream &operator>>(istream &is, Mint<Modulo> &x) noexcept {
    Int tmp;
    is >> tmp;
    x = Mint<Modulo>(tmp);
    return is;
  }
  friend constexpr Mint<Modulo> modpow(const Mint<Modulo> &a, Int n) noexcept {
    Mint res(1), tmp = a;
    while (n > 0) {
      if (n & 1)
        res *= tmp;
      tmp *= tmp;
      n >>= 1;
    }
    return res;
  }
};

using mint = Mint<>;

int main() {

  cin.tie(nullptr);
  ios::sync_with_stdio(false);

  Int x, y;
  cin >> x >> y;

  if ((x + y) % 3 != 0) {
    cout << 0 << "\n";
  } else {
    mint ans = 1;
    Int a = (x + y) / 3;
    Int b = min(x, y) - a;
    Int c = a - b;

    while (a) {
      ans *= a;
      a--;
    }
    while (b) {
      ans /= b;
      b--;
    }
    while (c) {
      ans /= c;
      c--;
    }
    cout << ans << "\n";
  }
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdlib>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

using namespace std;
using Int = long long;
Int INF = 1LL << 60;
const Int MOD = 1000000000 + 7;

template <int Modulo = MOD> struct Mint {
  Int val;
  constexpr Mint(Int v = 0) noexcept : val(v % Modulo) {
    if (val < 0)
      v += Modulo;
  }
  constexpr int getmod() { return Modulo; }
  constexpr Mint operator-() const noexcept { return val ? Modulo - val : 0; }
  constexpr Mint operator+(const Mint &r) const noexcept {
    return Mint(*this) += r;
  }
  constexpr Mint operator-(const Mint &r) const noexcept {
    return Mint(*this) -= r;
  }
  constexpr Mint operator*(const Mint &r) const noexcept {
    return Mint(*this) *= r;
  }
  constexpr Mint operator/(const Mint &r) const noexcept {
    return Mint(*this) /= r;
  }
  constexpr Mint &operator+=(const Mint &r) noexcept {
    val += r.val;
    if (val >= Modulo)
      val -= Modulo;
    return *this;
  }
  constexpr Mint &operator-=(const Mint &r) noexcept {
    val -= r.val;
    if (val < 0)
      val += Modulo;
    return *this;
  }
  constexpr Mint &operator*=(const Mint &r) noexcept {
    val = val * r.val % Modulo;
    return *this;
  }
  constexpr Mint &operator/=(const Mint &r) noexcept {
    Int a = r.val, b = Modulo, u = 1, v = 0;
    while (b) {
      Int t = a / b;
      a -= t * b;
      swap(a, b);
      u -= t * v;
      swap(u, v);
    }
    val = val * u % Modulo;
    if (val < 0)
      val += Modulo;
    return *this;
  }
  constexpr bool operator==(const Mint &r) const noexcept {
    return this->val == r.val;
  }
  constexpr bool operator!=(const Mint &r) const noexcept {
    return this->val != r.val;
  }
  friend ostream &operator<<(ostream &os, const Mint<Modulo> &x) noexcept {
    return os << x.val;
  }
  friend istream &operator>>(istream &is, Mint<Modulo> &x) noexcept {
    Int tmp;
    is >> tmp;
    x = Mint<Modulo>(tmp);
    return is;
  }
  friend constexpr Mint<Modulo> modpow(const Mint<Modulo> &a, Int n) noexcept {
    Mint res(1), tmp = a;
    while (n > 0) {
      if (n & 1)
        res *= tmp;
      tmp *= tmp;
      n >>= 1;
    }
    return res;
  }
};

using mint = Mint<>;

int main() {

  cin.tie(nullptr);
  ios::sync_with_stdio(false);

  Int x, y;
  cin >> x >> y;

  if ((x + y) % 3 != 0) {
    cout << 0 << "\n";
  } else if (y < (x + 1) / 2 || y > 2 * x) {
    cout << 0 << "\n";
  } else {
    mint ans = 1;
    Int a = (x + y) / 3;
    Int b = min(x, y) - a;
    Int c = a - b;

    while (a) {
      ans *= a;
      a--;
    }
    while (b) {
      ans /= b;
      b--;
    }
    while (c) {
      ans /= c;
      c--;
    }
    cout << ans << "\n";
  }
}