Problem p01452 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, k, n) for (int i = (k); i < (n); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(a) a.begin(), a.end()
#define MS(m, v) memset(m, v, sizeof(m))
#define D10 fixed << setprecision(10)
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1000000007;
const int INF = MOD + 1;
const ld EPS = 1e-12;
template <class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <class T> T &chmax(T &a, const T &b) { return a = max(a, b); }

/*--------------------template--------------------*/
struct Mod {
  ll num;
  Mod() : num(0) { ; }
  Mod(ll n) : num(n) { ; }
  operator ll() { return num; }
};

const ll mod = 1000000007;

Mod operator+(Mod a, Mod b) { return Mod((a.num + b.num) % mod); }
Mod operator-(Mod a, Mod b) { return Mod((mod + a.num - b.num) % mod); }
Mod operator*(Mod a, Mod b) { return Mod(((long long)a.num * b.num) % mod); }
Mod operator+=(Mod &a, Mod b) { return a = a + b; }
Mod operator-=(Mod &a, Mod b) { return a = a - b; }
Mod operator^(Mod a, ll n) {
  if (n == 0)
    return Mod(1);
  Mod res = (a * a) ^ (n / 2);
  if (n % 2)
    res = res * a;
  return res;
}
Mod inv(Mod a) { return a ^ (mod - 2); }
Mod operator/(Mod a, Mod b) { return a * inv(b); }

Mod fact[222222];

void init() {
  fact[0] = 1;
  REP(i, 222220) fact[i + 1] = fact[i] * (Mod)(i + 1);
}

/*
Mod fact(Mod n)
{
        if (n < 0) assert(false);
        if (n == 0 || n == 1) return 1;
        else return n*fact(n - (Mod)1);
}
*/
Mod nPk(Mod n, Mod k) {
  if (n < 0 || k < 0 || n < k)
    return 0;
  return fact[n] / fact[k];
}

Mod nCk(Mod n, Mod k) {
  if (n < 0 || k < 0 || n < k)
    return 0;
  return nPk(n, k) / fact[n - k];
}

Mod nHk(Mod n, Mod k) { return nCk(n + k - (Mod)1, k); }

int main() {
  init();
  int N, M, k;
  cin >> N >> M >> k;
  Mod n(N), m(M), ans(0);
  REP(i, k + 1) {
    int j = k - i;
    Mod ver = nCk(m + (Mod)2 * (Mod)i, i) - nCk(m + (Mod)2 * (Mod)i, i - 1);
    Mod hor = nCk(n + (Mod)2 * (Mod)j, j) - nCk(n + (Mod)2 * (Mod)j, j - 1);
    Mod vm = M + i * 2, vh = N + j * 2;
    Mod res = ver * hor * nCk(vm + vh, vh);
    ans += res;
  }
  cout << (int)ans << endl;
  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, k, n) for (int i = (k); i < (n); i++)
#define REP(i, n) FOR(i, 0, n)
#define ALL(a) a.begin(), a.end()
#define MS(m, v) memset(m, v, sizeof(m))
#define D10 fixed << setprecision(10)
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1000000007;
const int INF = MOD + 1;
const ld EPS = 1e-12;
template <class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <class T> T &chmax(T &a, const T &b) { return a = max(a, b); }

/*--------------------template--------------------*/
struct Mod {
  ll num;
  Mod() : num(0) { ; }
  Mod(ll n) : num(n) { ; }
  operator ll() { return num; }
};

const ll mod = 1000000007;

Mod operator+(Mod a, Mod b) { return Mod((a.num + b.num) % mod); }
Mod operator-(Mod a, Mod b) { return Mod((mod + a.num - b.num) % mod); }
Mod operator*(Mod a, Mod b) { return Mod(((long long)a.num * b.num) % mod); }
Mod operator+=(Mod &a, Mod b) { return a = a + b; }
Mod operator-=(Mod &a, Mod b) { return a = a - b; }
Mod operator^(Mod a, ll n) {
  if (n == 0)
    return Mod(1);
  Mod res = (a * a) ^ (n / 2);
  if (n % 2)
    res = res * a;
  return res;
}
Mod inv(Mod a) { return a ^ (mod - 2); }
Mod operator/(Mod a, Mod b) { return a * inv(b); }

Mod fact[111111];

void init() {
  fact[0] = 1;
  REP(i, 111110) fact[i + 1] = fact[i] * (Mod)(i + 1);
}

/*
Mod fact(Mod n)
{
        if (n < 0) assert(false);
        if (n == 0 || n == 1) return 1;
        else return n*fact(n - (Mod)1);
}
*/
Mod nPk(Mod n, Mod k) {
  if (n < 0 || k < 0 || n < k)
    return 0;
  return fact[n] / fact[k];
}

Mod nCk(Mod n, Mod k) {
  if (n < 0 || k < 0 || n < k)
    return 0;
  return nPk(n, k) / fact[n - k];
}

Mod nHk(Mod n, Mod k) { return nCk(n + k - (Mod)1, k); }

int main() {
  init();
  int N, M, k;
  cin >> N >> M >> k;
  Mod n(N), m(M), ans(0);
  REP(i, k + 1) {
    int j = k - i;
    Mod ver = nCk(m + (Mod)2 * (Mod)i, i) - nCk(m + (Mod)2 * (Mod)i, i - 1);
    Mod hor = nCk(n + (Mod)2 * (Mod)j, j) - nCk(n + (Mod)2 * (Mod)j, j - 1);
    Mod vm = M + i * 2, vh = N + j * 2;
    Mod res = ver * hor * nCk(vm + vh, vh);
    ans += res;
  }
  cout << (int)ans << endl;
  return 0;
}