Problem p03676 (C++)

Buggy submission (status: Runtime Error):
// template version 1.6
// {{{ define basic macro
using namespace std;
#include <bits/stdc++.h>
#include <iostream>
// varibable settings
#define int long long
#define INF 1000000000000000000LL
// #define INF 2147483647
#define MOD 1000000007LL
// #define MOD 998244353LL
#define infile "../test/sample-1.in"

#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define _rrep(i, n) rrepi(i, 0, n)
#define rrepi(i, a, b) for (int i = (int)(b - 1); i >= (int)(a); --i)
#define rrep(...) _overload3(__VA_ARGS__, rrepi, _rrep, )(__VA_ARGS__)
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define uni(x)                                                                 \
  sort(all(x));                                                                \
  x.erase(unique(all(x)), x.end())
#define ten(n) ((int)1e##n)
template <class T, size_t N> size_t sza(const T (&array)[N]) { return N; }
template <class T> inline void chmax(T &a, const T &b) {
  if (a < b)
    a = b;
}
template <class T> inline void chmin(T &a, const T &b) {
  if (a > b)
    a = b;
}
template <class T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
struct Fast {
  Fast() {
    std::cin.tie(0);
    ios::sync_with_stdio(false);
  }
} fast;

// dump macro
#ifdef PCM
#include "dump.hpp"
#else
#define dump(...) 42
#define dump_1d(...) 42
#define dump_2d(...) 42
#endif

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int, int> pii;
typedef tuple<int, int, int> iii;
template <typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
#define fi first
#define se second

// }}}

// {{{
#define MAX_P 200005
struct ModComb {
  ll fact[MAX_P]; // fact[n]: n!
  ll inv[MAX_P];  // inv[n]: n^(-1)
  ll finv[MAX_P]; // finv[n]: (n!)^(-1)
  ll mod;

  ModComb(ll mod) { // 階乗関連テーブルの初期化 O(n)
    this->mod = mod;
    fact[0] = 1;
    for (ll i = 1; i < MAX_P; i++)
      fact[i] = (fact[i - 1] * i) % mod;

    inv[1] = 1;
    for (ll i = 2; i < MAX_P; i++)
      inv[i] = inv[mod % i] * (mod - mod / i) % mod;

    finv[0] = 1; // 　高速(10倍程度)な逆元階乗テーブルの作成。
    for (ll i = 1; i < MAX_P; i++)
      finv[i] = finv[i - 1] * inv[i] % mod;
  }

  ll mod_comb(ll n, ll k) { // テーブルがあればO(1)
    if (k < 0 || k > n)
      return 0;
    else {
      return fact[n] * finv[k] % mod * finv[n - k] % mod;
    }
  }
};
// }}}

int solve() {
  int n;
  cin >> n;
  int a[n + 1];
  vi c(n + 1, -1);
  pii p;
  rep(i, n + 1) {
    cin >> a[i];
    if (c[a[i]] == -1) {
      c[a[i]] = i;
    } else {
      p = mp(c[a[i]], i);
    }
  }
  // dump_1d(a, n+1);
  // dump(p);

  ModComb mc(1000000007LL);
  // assert(mc.mod_comb(5, 2) == 10);

  rep(i, 1, n + 2) {
    int res = 0;
    // 0
    res += mc.mod_comb(n - 1, i);
    // 1
    res += 2 * mc.mod_comb(n - 1, i - 1);
    res -= mc.mod_comb(p.first + n - p.second, i - 1);

    // 2
    res += mc.mod_comb(n - 1, i - 2);

    assert(res >= 0);
    cout << (res % MOD >= 0 ? res % MOD : res % MOD + MOD) << endl;
  }

  return 0;
}

signed main() { //{{{
#ifdef INPUT_FROM_FILE
  std::ifstream in(infile);
  std::cin.rdbuf(in.rdbuf());
#endif
  solve();
  return 0;
} //}}}


Fixed submission:
// template version 1.6
// {{{ define basic macro
using namespace std;
#include <bits/stdc++.h>
#include <iostream>
// varibable settings
#define int long long
#define INF 1000000000000000000LL
// #define INF 2147483647
#define MOD 1000000007LL
// #define MOD 998244353LL
#define infile "../test/sample-1.in"

#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define _rrep(i, n) rrepi(i, 0, n)
#define rrepi(i, a, b) for (int i = (int)(b - 1); i >= (int)(a); --i)
#define rrep(...) _overload3(__VA_ARGS__, rrepi, _rrep, )(__VA_ARGS__)
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define uni(x)                                                                 \
  sort(all(x));                                                                \
  x.erase(unique(all(x)), x.end())
#define ten(n) ((int)1e##n)
template <class T, size_t N> size_t sza(const T (&array)[N]) { return N; }
template <class T> inline void chmax(T &a, const T &b) {
  if (a < b)
    a = b;
}
template <class T> inline void chmin(T &a, const T &b) {
  if (a > b)
    a = b;
}
template <class T = int> T in() {
  T x;
  cin >> x;
  return (x);
}
struct Fast {
  Fast() {
    std::cin.tie(0);
    ios::sync_with_stdio(false);
  }
} fast;

// dump macro
#ifdef PCM
#include "dump.hpp"
#else
#define dump(...) 42
#define dump_1d(...) 42
#define dump_2d(...) 42
#endif

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int, int> pii;
typedef tuple<int, int, int> iii;
template <typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
#define fi first
#define se second

// }}}

// {{{
#define MAX_P 200005
struct ModComb {
  ll fact[MAX_P]; // fact[n]: n!
  ll inv[MAX_P];  // inv[n]: n^(-1)
  ll finv[MAX_P]; // finv[n]: (n!)^(-1)
  ll mod;

  ModComb(ll mod) { // 階乗関連テーブルの初期化 O(n)
    this->mod = mod;
    fact[0] = 1;
    for (ll i = 1; i < MAX_P; i++)
      fact[i] = (fact[i - 1] * i) % mod;

    inv[1] = 1;
    for (ll i = 2; i < MAX_P; i++)
      inv[i] = inv[mod % i] * (mod - mod / i) % mod;

    finv[0] = 1; // 　高速(10倍程度)な逆元階乗テーブルの作成。
    for (ll i = 1; i < MAX_P; i++)
      finv[i] = finv[i - 1] * inv[i] % mod;
  }

  ll mod_comb(ll n, ll k) { // テーブルがあればO(1)
    if (k < 0 || k > n)
      return 0;
    else {
      return fact[n] * finv[k] % mod * finv[n - k] % mod;
    }
  }
};
// }}}

int solve() {
  int n;
  cin >> n;
  int a[n + 1];
  vi c(n + 1, -1);
  pii p;
  rep(i, n + 1) {
    cin >> a[i];
    if (c[a[i]] == -1) {
      c[a[i]] = i;
    } else {
      p = mp(c[a[i]], i);
    }
  }
  // dump_1d(a, n+1);
  // dump(p);

  ModComb mc(1000000007LL);
  // assert(mc.mod_comb(5, 2) == 10);

  rep(i, 1, n + 2) {
    int res = 0;
    // 0
    res += mc.mod_comb(n - 1, i);
    // 1
    res += 2 * mc.mod_comb(n - 1, i - 1);
    res -= mc.mod_comb(p.first + n - p.second, i - 1);

    // 2
    res += mc.mod_comb(n - 1, i - 2);

    cout << (res % MOD >= 0 ? res % MOD : res % MOD + MOD) << endl;
  }

  return 0;
}

signed main() { //{{{
#ifdef INPUT_FROM_FILE
  std::ifstream in(infile);
  std::cin.rdbuf(in.rdbuf());
#endif
  solve();
  return 0;
} //}}}