Problem p03674 (C++)

Buggy submission (status: Runtime Error):
// AtCoder-Template.cpp : このファイルには 'main'
// 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <vector>
using namespace std;
using ll = long long;
#define fst first
#define snd second
#define FOR(i, N) for (auto i = 0; i < N; ++i)
#define FORREV(i, N, _cnt) for (auto i = N - 1, cnt = _cnt; cnt > 0; --i, --cnt)
#define ALL(x) x.begin(), x.end()

/* clang-format off */
template <class T, size_t D> struct _vec { using type = vector<typename _vec<T, D - 1>::type>; };
template <class T> struct _vec<T, 0> { using type = T; };
template <class T, size_t D> using vec = typename _vec<T, D>::type;
template <class T> vector<T> make_v(size_t size, const T& init) { return vector<T>(size, init); }
template <class... Ts> auto make_v(size_t size, Ts... rest) { return vector<decltype(make_v(rest...))>(size, make_v(rest...)); }
template <class T> inline void chmin(T& a, const T& b) { if (b < a) a = b; }
template <class T> inline void chmax(T& a, const T& b) { if (b > a) a = b; }
/* clang-format on */

constexpr ll MOD = ll(1e9 + 7ll);

class Factorial {
public:
  Factorial() = delete;
  static ll myPow(ll x, ll n, ll m) {
    if (n == 0)
      return 1LL;
    if (n % 2LL == 0)
      return myPow(x * x % m, n / 2LL, m);
    else
      return x * myPow(x, n - 1, m) % m;
  }

  Factorial(ll N) : N(N) {
    // 1 ... N までの
    FAC.resize(N + 1LL);
    DEFAC.resize(N + 1LL);

    FAC[0] = FAC[1] = 1LL;
    FOR(i, N)
    (FAC[i + 1] = FAC[i] * (i + 1ll)) %= MOD;

    DEFAC[N] = myPow(FAC[N], MOD - 2, MOD);
    FOR(_i, N) {
      auto i = N - _i;
      (DEFAC[i - 1] = DEFAC[i] * i) %= MOD;
    }
  }
  ll getComb(ll N, ll B) {
    if (N < B) {
      throw "[Factorial]::getComb  nCb  b is larger than b.";
    }
    return (FAC[N] * DEFAC[N - B]) % MOD * (DEFAC[B]) % MOD;
  }
  vector<ll> FAC;
  vector<ll> DEFAC;
  ll N;
};

int main() {
#ifdef DEBUG
  ifstream ifs("in.txt");
  cin.rdbuf(ifs.rdbuf());
#endif
  ll N;
  cin >> N;
  N += 1;
  vector<ll> A(N);
  FOR(i, N) cin >> A[i];
  Factorial FAC(N + 1);
  set<ll> cnt;
  ll double_val = -1;
  for (auto av : A) {
    if (cnt.find(av) != cnt.end()) {
      double_val = av;
      break;
    } else {
      cnt.insert(av);
    }
  }
  ll a = -1, b;
  FOR(i, N) {
    auto av = A[i];
    if (av == double_val) {
      if (a == -1)
        a = i;
      else {
        b = i;
        break;
      }
    }
  }
  // 2回出てくる要素のインデックスをa,bに入れた。

  const ll kinds = N - 1;
  FOR(_i, N) {
    auto i = _i + 1;

    if (i == 1)
      cout << kinds << endl;
    else if (i == N)
      cout << 1 << endl;
    else {
      ll ans = FAC.getComb(N, i) % MOD;

      // 真ん中以外のみから選択する場合。片側だけ入った場合から、区別できないケースを引く。
      // ans -= (N - 2 - (b - a - 1) >= i - 1ll) ? FAC.getComb(N - 2 - (b - a -
      // 1), i - 1ll) : 0;

      ll remain_cnt = N - 2 - (b - a - 1);
      ans -= FAC.getComb(remain_cnt, i - 1LL);
      while (ans < 0)
        ans += MOD;
      cout << (ans) % MOD << endl;
    }
  }

  return 0;
}


Fixed submission:
// AtCoder-Template.cpp : このファイルには 'main'
// 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <vector>
using namespace std;
using ll = long long;
#define fst first
#define snd second
#define FOR(i, N) for (auto i = 0; i < N; ++i)
#define FORREV(i, N, _cnt) for (auto i = N - 1, cnt = _cnt; cnt > 0; --i, --cnt)
#define ALL(x) x.begin(), x.end()

/* clang-format off */
template <class T, size_t D> struct _vec { using type = vector<typename _vec<T, D - 1>::type>; };
template <class T> struct _vec<T, 0> { using type = T; };
template <class T, size_t D> using vec = typename _vec<T, D>::type;
template <class T> vector<T> make_v(size_t size, const T& init) { return vector<T>(size, init); }
template <class... Ts> auto make_v(size_t size, Ts... rest) { return vector<decltype(make_v(rest...))>(size, make_v(rest...)); }
template <class T> inline void chmin(T& a, const T& b) { if (b < a) a = b; }
template <class T> inline void chmax(T& a, const T& b) { if (b > a) a = b; }
/* clang-format on */

constexpr ll MOD = ll(1e9 + 7ll);

class Factorial {
public:
  Factorial() = delete;
  static ll myPow(ll x, ll n, ll m) {
    if (n == 0)
      return 1LL;
    if (n % 2LL == 0)
      return myPow(x * x % m, n / 2LL, m);
    else
      return x * myPow(x, n - 1, m) % m;
  }

  Factorial(ll N) : N(N) {
    // 1 ... N までの
    FAC.resize(N + 1LL);
    DEFAC.resize(N + 1LL);

    FAC[0] = FAC[1] = 1LL;
    FOR(i, N)
    (FAC[i + 1] = FAC[i] * (i + 1ll)) %= MOD;

    DEFAC[N] = myPow(FAC[N], MOD - 2, MOD);
    FOR(_i, N) {
      auto i = N - _i;
      (DEFAC[i - 1] = DEFAC[i] * i) %= MOD;
    }
  }
  ll getComb(ll N, ll B) {
    if (N < B) {
      throw "[Factorial]::getComb  nCb  b is larger than b.";
    }
    return (FAC[N] * DEFAC[N - B]) % MOD * (DEFAC[B]) % MOD;
  }
  vector<ll> FAC;
  vector<ll> DEFAC;
  ll N;
};

int main() {
#ifdef DEBUG
  ifstream ifs("in.txt");
  cin.rdbuf(ifs.rdbuf());
#endif
  ll N;
  cin >> N;
  N += 1;
  vector<ll> A(N);
  FOR(i, N) cin >> A[i];
  Factorial FAC(N + 1);
  set<ll> cnt;
  ll double_val = -1;
  for (auto av : A) {
    if (cnt.find(av) != cnt.end()) {
      double_val = av;
      break;
    } else {
      cnt.insert(av);
    }
  }
  ll a = -1, b;
  FOR(i, N) {
    auto av = A[i];
    if (av == double_val) {
      if (a == -1)
        a = i;
      else {
        b = i;
        break;
      }
    }
  }
  // 2回出てくる要素のインデックスをa,bに入れた。

  const ll kinds = N - 1;
  FOR(_i, N) {
    auto i = _i + 1;

    if (i == 1)
      cout << kinds << endl;
    else if (i == N)
      cout << 1 << endl;
    else {
      ll ans = FAC.getComb(N, i) % MOD;

      // 真ん中以外のみから選択する場合。片側だけ入った場合から、区別できないケースを引く。
      // ans -= (N - 2 - (b - a - 1) >= i - 1ll) ? FAC.getComb(N - 2 - (b - a -
      // 1), i - 1ll) : 0;

      ll remain_cnt = N - 2 - (b - a - 1);
      if (remain_cnt >= i - 1)
        ans -= FAC.getComb(remain_cnt, i - 1LL);
      while (ans < 0)
        ans += MOD;
      cout << (ans) % MOD << endl;
    }
  }

  return 0;
}