Problem p04004 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
typedef pair<double, double> pdd;
#define SQ(i) ((i) * (i))
#define MEM(a, b) memset(a, (b), sizeof(a))
#define SZ(i) int(i.size())
#define FOR(i, j, k, in) for (int i = j; i < k; i += in)
#define RFOR(i, j, k, in) for (int i = j; i >= k; i -= in)
#define REP(i, j) FOR(i, 0, j, 1)
#define REP1(i, j) FOR(i, 1, j + 1, 1)
#define RREP(i, j) RFOR(i, j, 0, 1)
#define ALL(_a) _a.begin(), _a.end()
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define X first
#define Y second
#ifdef tmd
#define TIME(i) Timer i(#i)
#define debug(...)                                                             \
  do {                                                                         \
    fprintf(stderr, "%s - %d (%s) = ", __PRETTY_FUNCTION__, __LINE__,          \
            #__VA_ARGS__);                                                     \
    _do(__VA_ARGS__);                                                          \
  } while (0)
template <typename T> void _do(T &&_x) { cerr << _x << endl; }
template <typename T, typename... S> void _do(T &&_x, S &&..._t) {
  cerr << _x << " ,";
  _do(_t...);
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, const pair<_a, _b> &_p) {
  return _s << "(" << _p.X << "," << _p.Y << ")";
}
template <typename It> ostream &_OUTC(ostream &_s, It _ita, It _itb) {
  _s << "{";
  for (It _it = _ita; _it != _itb; _it++) {
    _s << (_it == _ita ? "" : ",") << *_it;
  }
  _s << "}";
  return _s;
}
template <typename _a> ostream &operator<<(ostream &_s, vector<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a> ostream &operator<<(ostream &_s, set<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a> ostream &operator<<(ostream &_s, deque<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, map<_a, _b> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _t> void pary(_t _a, _t _b) {
  _OUTC(cerr, _a, _b);
  cerr << endl;
}
#define IOS()
#else
#define TIME(i)
#define debug(...)
#define pary(...)
#define endl '\n'
#define IOS()                                                                  \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0)
#endif
class Timer {
private:
  string scope_name;
  chrono::high_resolution_clock::time_point start_time;

public:
  Timer(string name) : scope_name(name) {
    start_time = chrono::high_resolution_clock::now();
  }
  ~Timer() {
    auto stop_time = chrono::high_resolution_clock::now();
    auto length =
        chrono::duration_cast<chrono::microseconds>(stop_time - start_time)
            .count();
    double mlength = double(length) * 0.001;
    debug(scope_name, mlength);
  }
};

const ll MOD = 1000000007;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int iNF = 0x3f3f3f3f;
const ll MAXN = 300005;

ll n, m, k;
ll fact[MAXN], inv[MAXN];

ll mpow(ll bs, ll ep) {
  ll ret = 1;
  while (ep) {
    if (ep & 1) {
      ret = ret * bs % MOD;
    }
    ep >>= 1;
    bs = bs * bs % MOD;
  }
  return ret;
}

ll cob(ll a, ll b) { return fact[a] * inv[b] % MOD * inv[a - b] % MOD; }
/********** Good Luck :) **********/
int main() {
  TIME(main);
  IOS();
  debug(mpow(2, 10));

  cin >> n >> m >> k;

  inv[0] = fact[0] = 1;
  REP1(i, MAXN - 1) {
    fact[i] = fact[i - 1] * i % MOD;
    inv[i] = mpow(fact[i], MOD - 2);
  }

  ll ans = mpow(3, m + k);

  ll sum = 1;
  REP1(i, m + k) {
    sum = sum * 2 % MOD;
    if (i > m) {
      sum -= cob(i - 1, m);
    }
    if (i > k) {
      sum -= cob(i - 1, k);
    }
    sum = (sum % MOD + MOD) % MOD;
    debug(sum);
    ll cur = sum * cob(n + i - 1, n - 1) % MOD * mpow(3, m + k - i) % MOD;
    debug(cur);
    ans = (ans + cur) % MOD;
  }

  cout << ans << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
typedef pair<double, double> pdd;
#define SQ(i) ((i) * (i))
#define MEM(a, b) memset(a, (b), sizeof(a))
#define SZ(i) int(i.size())
#define FOR(i, j, k, in) for (int i = j; i < k; i += in)
#define RFOR(i, j, k, in) for (int i = j; i >= k; i -= in)
#define REP(i, j) FOR(i, 0, j, 1)
#define REP1(i, j) FOR(i, 1, j + 1, 1)
#define RREP(i, j) RFOR(i, j, 0, 1)
#define ALL(_a) _a.begin(), _a.end()
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define X first
#define Y second
#ifdef tmd
#define TIME(i) Timer i(#i)
#define debug(...)                                                             \
  do {                                                                         \
    fprintf(stderr, "%s - %d (%s) = ", __PRETTY_FUNCTION__, __LINE__,          \
            #__VA_ARGS__);                                                     \
    _do(__VA_ARGS__);                                                          \
  } while (0)
template <typename T> void _do(T &&_x) { cerr << _x << endl; }
template <typename T, typename... S> void _do(T &&_x, S &&..._t) {
  cerr << _x << " ,";
  _do(_t...);
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, const pair<_a, _b> &_p) {
  return _s << "(" << _p.X << "," << _p.Y << ")";
}
template <typename It> ostream &_OUTC(ostream &_s, It _ita, It _itb) {
  _s << "{";
  for (It _it = _ita; _it != _itb; _it++) {
    _s << (_it == _ita ? "" : ",") << *_it;
  }
  _s << "}";
  return _s;
}
template <typename _a> ostream &operator<<(ostream &_s, vector<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a> ostream &operator<<(ostream &_s, set<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a> ostream &operator<<(ostream &_s, deque<_a> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _a, typename _b>
ostream &operator<<(ostream &_s, map<_a, _b> &_c) {
  return _OUTC(_s, ALL(_c));
}
template <typename _t> void pary(_t _a, _t _b) {
  _OUTC(cerr, _a, _b);
  cerr << endl;
}
#define IOS()
#else
#define TIME(i)
#define debug(...)
#define pary(...)
#define endl '\n'
#define IOS()                                                                  \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0)
#endif
class Timer {
private:
  string scope_name;
  chrono::high_resolution_clock::time_point start_time;

public:
  Timer(string name) : scope_name(name) {
    start_time = chrono::high_resolution_clock::now();
  }
  ~Timer() {
    auto stop_time = chrono::high_resolution_clock::now();
    auto length =
        chrono::duration_cast<chrono::microseconds>(stop_time - start_time)
            .count();
    double mlength = double(length) * 0.001;
    debug(scope_name, mlength);
  }
};

const ll MOD = 1000000007;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int iNF = 0x3f3f3f3f;
const ll MAXN = 900005;

ll n, m, k;
ll fact[MAXN], inv[MAXN];

ll mpow(ll bs, ll ep) {
  ll ret = 1;
  while (ep) {
    if (ep & 1) {
      ret = ret * bs % MOD;
    }
    ep >>= 1;
    bs = bs * bs % MOD;
  }
  return ret;
}

ll cob(ll a, ll b) { return fact[a] * inv[b] % MOD * inv[a - b] % MOD; }
/********** Good Luck :) **********/
int main() {
  TIME(main);
  IOS();
  debug(mpow(2, 10));

  cin >> n >> m >> k;

  inv[0] = fact[0] = 1;
  REP1(i, MAXN - 1) {
    fact[i] = fact[i - 1] * i % MOD;
    inv[i] = mpow(fact[i], MOD - 2);
  }

  ll ans = mpow(3, m + k);

  ll sum = 1;
  REP1(i, m + k) {
    sum = sum * 2 % MOD;
    if (i > m) {
      sum -= cob(i - 1, m);
    }
    if (i > k) {
      sum -= cob(i - 1, k);
    }
    sum = (sum % MOD + MOD) % MOD;
    debug(sum);
    ll cur = sum * cob(n + i - 1, n - 1) % MOD * mpow(3, m + k - i) % MOD;
    debug(cur);
    ans = (ans + cur) % MOD;
  }

  cout << ans << endl;
  return 0;
}