Problem p02782 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
using namespace std;
typedef long long int ll;

// clang-format off
#ifdef _DEBUG_
#define dump(...) do{ cerr << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; PPPPP(__VA_ARGS__); cerr << endl; } while(false)
template<typename T> void PPPPP(T t) { cerr << t; }
template<typename T, typename... S> void PPPPP(T t, S... s) { cerr << t << ", "; PPPPP(s...); }
#else
#define dump(...)
#endif
template<typename T> vector<T> make_v(size_t a, T b) { return vector<T>(a, b); }
template<typename... Ts> auto make_v(size_t a, Ts... ts) { return vector<decltype(make_v(ts...))>(a, make_v(ts...)); }
template<typename T>
bool chmin(T &a, T b) { if (a > b) {a = b; return true; } return false;}
template<typename T>
bool chmax(T &a, T b) { if (a < b) {a = b; return true; } return false;}
// clang-format on

template <ll MOD = 1000000007> class ModInt {
  ll n;
  static constexpr ModInt pow(const ModInt x, ll p) {
    ModInt<MOD> ans = 1;
    for (ModInt<MOD> m = x; p > 0; p /= 2, m *= m) {
      if (p % 2)
        ans *= m;
    }
    return ans;
  }
  ModInt constexpr inverse() const { return ModInt::pow(*this, MOD - 2); }

public:
  ModInt() : n(0) {}
  ModInt(ll _n) : n(((_n % MOD) + MOD) % MOD) {}
  ModInt operator+=(const ModInt &m) {
    n += m.n;
    if (n >= MOD)
      n -= MOD;
    return *this;
  }
  ModInt operator-=(const ModInt &m) {
    n -= m.n;
    if (n < 0)
      n += MOD;
    return *this;
  }
  ModInt operator*=(const ModInt &m) {
    n *= m.n;
    if (n >= MOD)
      n %= MOD;
    return *this;
  }
  ModInt operator/=(const ModInt &m) {
    (*this) *= m.inverse();
    return *this;
  }
  friend ModInt operator+(ModInt t, const ModInt &m) { return t += m; }
  friend ModInt operator-(ModInt t, const ModInt &m) { return t -= m; }
  friend ModInt operator*(ModInt t, const ModInt &m) { return t *= m; }
  friend ModInt operator/(ModInt t, const ModInt &m) { return t /= m; }
  ModInt operator=(const ll l) {
    n = l % MOD;
    if (n < 0)
      n += MOD;
    return *this;
  }
  friend ostream &operator<<(ostream &out, const ModInt &m) {
    out << m.n;
    return out;
  }
  friend istream &operator>>(istream &in, ModInt &m) {
    ll l;
    in >> l;
    m = l;
    return in;
  }
};
using mint = ModInt<>;
mint operator"" _m(unsigned long long m) { return mint(m); }

int SZ = 1000010;
vector<mint> fact(SZ, 1);

mint nCr(int n, int r) { return fact[n] / fact[r] / fact[n - r]; }

mint calc(int r, int c) {
  return (nCr(c + r + 2, r) * (c + 2) - r - 1) / (r + 1);
}

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  REP(i, 0, SZ - 1) { fact[i + 1] = fact[i] * (i + 1); }
  int r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  cout << calc(r2, c2) - calc(r1 - 1, c2) - calc(r2, c1 - 1) +
              calc(r1 - 1, c1 - 1)
       << endl;
  return 0;
}


Fixed submission:
#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
using namespace std;
typedef long long int ll;

// clang-format off
#ifdef _DEBUG_
#define dump(...) do{ cerr << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; PPPPP(__VA_ARGS__); cerr << endl; } while(false)
template<typename T> void PPPPP(T t) { cerr << t; }
template<typename T, typename... S> void PPPPP(T t, S... s) { cerr << t << ", "; PPPPP(s...); }
#else
#define dump(...)
#endif
template<typename T> vector<T> make_v(size_t a, T b) { return vector<T>(a, b); }
template<typename... Ts> auto make_v(size_t a, Ts... ts) { return vector<decltype(make_v(ts...))>(a, make_v(ts...)); }
template<typename T>
bool chmin(T &a, T b) { if (a > b) {a = b; return true; } return false;}
template<typename T>
bool chmax(T &a, T b) { if (a < b) {a = b; return true; } return false;}
// clang-format on

template <ll MOD = 1000000007> class ModInt {
  ll n;
  static constexpr ModInt pow(const ModInt x, ll p) {
    ModInt<MOD> ans = 1;
    for (ModInt<MOD> m = x; p > 0; p /= 2, m *= m) {
      if (p % 2)
        ans *= m;
    }
    return ans;
  }
  ModInt constexpr inverse() const { return ModInt::pow(*this, MOD - 2); }

public:
  ModInt() : n(0) {}
  ModInt(ll _n) : n(((_n % MOD) + MOD) % MOD) {}
  ModInt operator+=(const ModInt &m) {
    n += m.n;
    if (n >= MOD)
      n -= MOD;
    return *this;
  }
  ModInt operator-=(const ModInt &m) {
    n -= m.n;
    if (n < 0)
      n += MOD;
    return *this;
  }
  ModInt operator*=(const ModInt &m) {
    n *= m.n;
    if (n >= MOD)
      n %= MOD;
    return *this;
  }
  ModInt operator/=(const ModInt &m) {
    (*this) *= m.inverse();
    return *this;
  }
  friend ModInt operator+(ModInt t, const ModInt &m) { return t += m; }
  friend ModInt operator-(ModInt t, const ModInt &m) { return t -= m; }
  friend ModInt operator*(ModInt t, const ModInt &m) { return t *= m; }
  friend ModInt operator/(ModInt t, const ModInt &m) { return t /= m; }
  ModInt operator=(const ll l) {
    n = l % MOD;
    if (n < 0)
      n += MOD;
    return *this;
  }
  friend ostream &operator<<(ostream &out, const ModInt &m) {
    out << m.n;
    return out;
  }
  friend istream &operator>>(istream &in, ModInt &m) {
    ll l;
    in >> l;
    m = l;
    return in;
  }
};
using mint = ModInt<>;
mint operator"" _m(unsigned long long m) { return mint(m); }

int SZ = 2000200;
vector<mint> fact(SZ, 1);

mint nCr(int n, int r) { return fact[n] / fact[r] / fact[n - r]; }

mint calc(int r, int c) {
  return (nCr(c + r + 2, r) * (c + 2) - r - 1) / (r + 1);
}

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  REP(i, 0, SZ - 1) { fact[i + 1] = fact[i] * (i + 1); }
  int r1, c1, r2, c2;
  cin >> r1 >> c1 >> r2 >> c2;
  cout << calc(r2, c2) - calc(r1 - 1, c2) - calc(r2, c1 - 1) +
              calc(r1 - 1, c1 - 1)
       << endl;
  return 0;
}