Problem p04004 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define X first
#define Y second
#define pb push_back
#define rep(X, Y) for (int(X) = 0; (X) < (Y); ++(X))
#define reps(X, S, Y) for (int(X) = S; (X) < (Y); ++(X))
#define rrep(X, Y) for (int(X) = (Y)-1; (X) >= 0; --(X))
#define repe(X, Y) for ((X) = 0; (X) < (Y); ++(X))
#define peat(X, Y) for (; (X) < (Y); ++(X))
#define all(X) (X).begin(), (X).end()
#define rall(X) (X).rbegin(), (X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)), (X).end())

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T> using vv = vector<vector<T>>;
template <class T> ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class T> inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T> inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
const ll MOD = 1e9 + 7;

ll modpow(ll r, ll n, ll m = MOD) {
  ll re = 1, d = r % m;
  if (n < 0)
    (n %= MOD - 1) += MOD - 1;
  for (; n; n /= 2) {
    if (n & 1)
      (re *= d) %= m;
    (d *= d) %= m;
  }
  return re;
}
vector<ll> fact, finv, inv;
ll comb(ll n, ll r) {
  if (n < r || r < 0)
    return 0;
  return fact[n] * finv[n - r] % MOD * finv[r] % MOD;
}
class Doralion {
  void Modinvs(vector<ll> &re, int n) {
    re.resize(n + 1);
    re[1] = 1;
    for (int i = 2; i <= n; ++i)
      re[i] = re[MOD % i] * (MOD - MOD / i) % MOD;
  }
  void Facts(vector<ll> &re, int n) {
    re.resize(n + 1);
    re[0] = 1;
    rep(i, n) re[i + 1] = re[i] * (i + 1) % MOD;
  }
  void Factinvs(vector<ll> &re, const vector<ll> &inv, int n) {
    re.resize(n + 1);
    re[0] = 1;
    rep(i, n) re[i + 1] = re[i] * inv[i + 1] % MOD;
  }

public:
  Doralion(int n) {
    Modinvs(inv, n);
    Facts(fact, n);
    Factinvs(finv, inv, n);
  }
} doralion(212345);

int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  int n, m, t;
  cin >> n >> m >> t;
  ll re = 0, pw = modpow(3, m + t), sum = 1;
  rep(i, m + t + 1) {
    (re += pw * comb(n - 1 + i, i) % MOD * sum % MOD) %= MOD;
    // cout<<pw<<","<<comb(n-1+i,i)<<","<<sum<<endl;
    (pw *= inv[3]) %= MOD;
    (sum *= 2) %= MOD;
    if (t <= i)
      (sum += MOD - comb(i, i - t)) %= MOD;
    if (m <= i)
      (sum += MOD - comb(i, i - m)) %= MOD;
  }
  // rep(i,m+1)rep(j,t+1)
  // (re+=comb(n-1+i+j,i)*comb(n-1+j,j)%MOD*modpow(3,m+t-i-j)%MOD)%=MOD;
  cout << re << endl;
  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define X first
#define Y second
#define pb push_back
#define rep(X, Y) for (int(X) = 0; (X) < (Y); ++(X))
#define reps(X, S, Y) for (int(X) = S; (X) < (Y); ++(X))
#define rrep(X, Y) for (int(X) = (Y)-1; (X) >= 0; --(X))
#define repe(X, Y) for ((X) = 0; (X) < (Y); ++(X))
#define peat(X, Y) for (; (X) < (Y); ++(X))
#define all(X) (X).begin(), (X).end()
#define rall(X) (X).rbegin(), (X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)), (X).end())

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T> using vv = vector<vector<T>>;
template <class T> ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  rep(i, t.size()) { os << t[i] << ","; }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class T> inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T> inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
const ll MOD = 1e9 + 7;

ll modpow(ll r, ll n, ll m = MOD) {
  ll re = 1, d = r % m;
  if (n < 0)
    (n %= MOD - 1) += MOD - 1;
  for (; n; n /= 2) {
    if (n & 1)
      (re *= d) %= m;
    (d *= d) %= m;
  }
  return re;
}
vector<ll> fact, finv, inv;
ll comb(ll n, ll r) {
  if (n < r || r < 0)
    return 0;
  return fact[n] * finv[n - r] % MOD * finv[r] % MOD;
}
class Doralion {
  void Modinvs(vector<ll> &re, int n) {
    re.resize(n + 1);
    re[1] = 1;
    for (int i = 2; i <= n; ++i)
      re[i] = re[MOD % i] * (MOD - MOD / i) % MOD;
  }
  void Facts(vector<ll> &re, int n) {
    re.resize(n + 1);
    re[0] = 1;
    rep(i, n) re[i + 1] = re[i] * (i + 1) % MOD;
  }
  void Factinvs(vector<ll> &re, const vector<ll> &inv, int n) {
    re.resize(n + 1);
    re[0] = 1;
    rep(i, n) re[i + 1] = re[i] * inv[i + 1] % MOD;
  }

public:
  Doralion(int n) {
    Modinvs(inv, n);
    Facts(fact, n);
    Factinvs(finv, inv, n);
  }
} doralion(1123456);

int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  int n, m, t;
  cin >> n >> m >> t;
  ll re = 0, pw = modpow(3, m + t), sum = 1;
  rep(i, m + t + 1) {
    (re += pw * comb(n - 1 + i, i) % MOD * sum % MOD) %= MOD;
    // cout<<pw<<","<<comb(n-1+i,i)<<","<<sum<<endl;
    (pw *= inv[3]) %= MOD;
    (sum *= 2) %= MOD;
    if (t <= i)
      (sum += MOD - comb(i, i - t)) %= MOD;
    if (m <= i)
      (sum += MOD - comb(i, i - m)) %= MOD;
  }
  // rep(i,m+1)rep(j,t+1)
  // (re+=comb(n-1+i+j,i)*comb(n-1+j,j)%MOD*modpow(3,m+t-i-j)%MOD)%=MOD;
  cout << re << endl;
  return 0;
}