#include <bits/stdc++.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#include <cassert>
#include <queue>
#include <random>
#include <stack>
#include <iomanip>
#include <math.h>
using namespace std;
#define rep(i, n) for (ll i = 0; i < (ll)n; i++)
#define repf(i, a, b) for (ll i = (ll)a; i < (ll)b; i++)
#define repr(i, a, b) for (ll i = (ll)a; i > (ll)b; i--)
#define repv(x, arr) for (auto &x : arr)
#define all(v) (v).begin(), (v).end()
#define vec(name, num) vector<ll> name((num), 0);
#define mp(a, b) make_pair(a, b)
#define pb(x) push_back(x)
#define F first
#define S second
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vii;
typedef vector<vii> vvii;
const ll mod = 1e9 + 7;
const int infi = 2147483600;
const ll infl = 1e17;

struct COMB
{
    int L;
    vll kaijo, gyaku;
    void __init__(int sz)
    {
        L = sz;
        kaijo.resize(L + 1, 0);
        gyaku.resize(L + 1, 0);
        kaijo[0] = 1;
        repf(i, 1, L + 1)
            kaijo[i] = (kaijo[i - 1] * i) % mod;
        gyaku[L] = powmod(kaijo[L], mod - 2, mod);
        rep(i, L)
            gyaku[L - 1 - i] = gyaku[L - i] * (L - i) % mod;
    }
    ll powmod(ll x, ll y, ll mod)
    {
        map<ll, ll> Z;
        Z[0] = 1;
        Z[1] = x;
        ll nowy = 1;
        ll nowx = x;
        while (nowy * 2 <= y)
        {
            nowy *= 2;
            nowx = nowx * nowx % mod;
            Z[nowy] = nowx;
        }
        ll nowz = nowy / 2;
        while (nowy < y)
        {
            if (nowz + nowy <= y)
            {
                nowy += nowz;
                nowx = (nowx * Z[nowz]) % mod;
            }
            nowz /= 2;
        }
        return nowx;
    }

    ll calc_comb(int n, int k)
    {
        if (n > L)
            return -1;
        return (((kaijo[n] * gyaku[k]) % mod) * gyaku[n - k]) % mod;
    }
    ll calc_kaijo(int i)
    {
        return kaijo[i];
    }
    ll calc_gyaku(int i)
    {
        return gyaku[i];
    }
};

int main()
{
    ll n;
    cin >> n;
    vll a(n + 1);
    map<ll, ll> idx;
    ll x1, x2;
    rep(i, n + 1)
    {
        cin >> a[i];
        if (idx[a[i]] > 0)
        {
            x1 = idx[a[i]];
            x2 = i + 1;
        }
        idx[a[i]] = i + 1;
    }
    ll m = x1 - 1 + n + 1 - x2;
    COMB comb;
    comb.__init__(n + 100);
    repf(k, 1, n+1)
    {
        ll res = 0;
        if (k > 1)
            res = (res + comb.calc_comb(n - 1, k - 2)) % mod;
        if (k<=n-1)
            res = (res + comb.calc_comb(n - 1, k)) % mod;
        
        if (m < k - 1)
        {
            res = (res +( (comb.calc_comb(n - 1, k - 1) * 2 )% mod)) % mod;
        }
        else if (m>=k-1)
        {
            ll c1 = comb.calc_comb(n - 1, k - 1);
            ll c2 = comb.calc_comb(m, k - 1);
            c1 = (mod + c1 - c2) % mod;
            res = (res +( ((c1 * 2 % mod) + c2)%mod)) % mod;
        }
        cout << res << endl;
    }
    cout << comb.calc_comb(n - 1, n - 1) % mod << endl;
}


Measured memory_bytes: 9856