Problem p02768 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"

#define REP(i, num) for (int i = 0; i < (num); ++i)
#define LOOP(i) while (i--)
#define ALL(c) c.begin(), c.end()
#define PRINTALL(c)                                                            \
  for (auto pitr = c.begin(); pitr != c.end(); ++pitr) {                       \
    cout << *pitr;                                                             \
    if (next(pitr, 1) != c.end())                                              \
      cout << ' ';                                                             \
  }                                                                            \
  cout << endl;
#define PAIRCOMP(c, comp)                                                      \
  [](const pair<ll, ll> &lhs, const pair<ll, ll> &rhs) {                       \
    return lhs.c comp rhs.c;                                                   \
  }

using namespace std;
using ll = long long;

constexpr ll atcoder_mod = 1e9 + 7;

template <typename T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
template <typename T = int, typename C = vector<T>> C vecin(int N) {
  C x(N);
  REP(i, N) { x[i] = in<T>(); }
  return move(x);
}

void vout() { cout << endl; }
template <typename Head, typename... Tail> void vout(Head &&h, Tail &&...t) {
  cout << ' ' << h;
  vout(forward<Tail>(t)...);
}
void out() { cout << endl; }
template <typename Head, typename... Tail> void out(Head &&h, Tail &&...t) {
  cout << h;
  vout(forward<Tail>(t)...);
}

class Combination {
  constexpr static int atcoder_mod = 1000000007;
  vector<ll> fac, finv, inv;

public:
  Combination(ll N) {
    fac.resize(N + 1);
    finv.resize(N + 1);
    inv.resize(N + 1);
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i <= N; i++) {
      fac[i] = fac[i - 1] * i % atcoder_mod;
      inv[i] =
          atcoder_mod - inv[atcoder_mod % i] * (atcoder_mod / i) % atcoder_mod;
      finv[i] = finv[i - 1] * inv[i] % atcoder_mod;
    }
  }
  ll Caluclation(ll n, ll r) {
    if (n < r)
      return 0;
    if (n < 0 || r < 0)
      return 0;
    return fac[n] * (finv[r] * finv[n - r] % atcoder_mod) % atcoder_mod;
  }
  ll GetFInv(ll i) { return finv[i]; }
};

ll powermod(ll a, ll b, ll m) {
  if (b == 0) {
    return 1LL;
  }
  if (b % 2) {
    return (a * powermod(a, b - 1LL, m)) % m;
  }
  return powermod((a * a) % m, b / 2LL, m);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  int N = in(), A = in(), B = in();
  Combination comb(B);
  vector<ll> dp(N + 1);
  dp[0] = 1;
  REP(i, B) {
    dp[i + 1] = ((dp[i] * (N - i)) % atcoder_mod);
    dp[i + 1] %= atcoder_mod;
  }

  int L = (dp[A] * comb.GetFInv(A)) % atcoder_mod +
          (dp[B] * comb.GetFInv(B)) % atcoder_mod;
  L %= atcoder_mod;
  out((powermod(2, N, atcoder_mod) - 1 - L + atcoder_mod) % atcoder_mod);
  return 0;
}


Fixed submission:
#include "bits/stdc++.h"

#define REP(i, num) for (int i = 0; i < (num); ++i)
#define LOOP(i) while (i--)
#define ALL(c) c.begin(), c.end()
#define PRINTALL(c)                                                            \
  for (auto pitr = c.begin(); pitr != c.end(); ++pitr) {                       \
    cout << *pitr;                                                             \
    if (next(pitr, 1) != c.end())                                              \
      cout << ' ';                                                             \
  }                                                                            \
  cout << endl;
#define PAIRCOMP(c, comp)                                                      \
  [](const pair<ll, ll> &lhs, const pair<ll, ll> &rhs) {                       \
    return lhs.c comp rhs.c;                                                   \
  }

using namespace std;
using ll = long long;

constexpr ll atcoder_mod = 1e9 + 7;

template <typename T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
template <typename T = int, typename C = vector<T>> C vecin(int N) {
  C x(N);
  REP(i, N) { x[i] = in<T>(); }
  return move(x);
}

void vout() { cout << endl; }
template <typename Head, typename... Tail> void vout(Head &&h, Tail &&...t) {
  cout << ' ' << h;
  vout(forward<Tail>(t)...);
}
void out() { cout << endl; }
template <typename Head, typename... Tail> void out(Head &&h, Tail &&...t) {
  cout << h;
  vout(forward<Tail>(t)...);
}

class Combination {
  constexpr static int atcoder_mod = 1000000007;
  vector<ll> fac, finv, inv;

public:
  Combination(ll N) {
    fac.resize(N + 1);
    finv.resize(N + 1);
    inv.resize(N + 1);
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i <= N; i++) {
      fac[i] = fac[i - 1] * i % atcoder_mod;
      inv[i] =
          atcoder_mod - inv[atcoder_mod % i] * (atcoder_mod / i) % atcoder_mod;
      finv[i] = finv[i - 1] * inv[i] % atcoder_mod;
    }
  }
  ll Caluclation(ll n, ll r) {
    if (n < r)
      return 0;
    if (n < 0 || r < 0)
      return 0;
    return fac[n] * (finv[r] * finv[n - r] % atcoder_mod) % atcoder_mod;
  }
  ll GetFInv(ll i) { return finv[i]; }
};

ll powermod(ll a, ll b, ll m) {
  if (b == 0) {
    return 1LL;
  }
  if (b % 2) {
    return (a * powermod(a, b - 1LL, m)) % m;
  }
  return powermod((a * a) % m, b / 2LL, m);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  int N = in(), A = in(), B = in();
  Combination comb(B);
  vector<ll> dp(B + 1);
  dp[0] = 1;
  REP(i, B) {
    dp[i + 1] = ((dp[i] * (N - i)) % atcoder_mod);
    dp[i + 1] %= atcoder_mod;
  }

  int L = (dp[A] * comb.GetFInv(A)) % atcoder_mod +
          (dp[B] * comb.GetFInv(B)) % atcoder_mod;
  L %= atcoder_mod;
  out((powermod(2, N, atcoder_mod) - 1 - L + atcoder_mod) % atcoder_mod);
  return 0;
}