def D_11(x):

    n = x[0]  # 整数の数

    a = x[1:]  # 数列

    M = 10**9 + 7  # 求めた解の剰余をこれで取る



    s = set()

    result = [x for x in a if x in s or s.add(x)]

    # for x in a:

    # if x in s:

    #     result.append(x)

    # s.add(x) と同じ書き方

    index = [i for i, x in enumerate(a) if x == result[0]]

    l = index[0] + 1

    r = index[1] + 1



    # フェルマーの小定理を用いてコンビネーションを効率よく計算

    factrial = [1] * (n + 2)

    for k in range(1, n + 2):

        factrial[k] = (factrial[k - 1] * k) % M



    fact_inv = [1] * (n + 2)

    fact_inv[n + 1] = pow(factrial[n + 1], M - 2, M)

    for k in range(n, -1, -1):

        fact_inv[k] = (fact_inv[k + 1] * (k + 1)) % M

    # Mについて等式[(n-1)!]^(-1)=(n!)^(-1)*nの剰余を取ると

    # [(n-1)!]^(M-2)%M = [(n!)^(M-2)*n]%M になるからという感じ？ 



    def nCr(n, r, M):

        if n < 0 or r < 0 or n < r:

            return 0

        else:

            return (factrial[n] * fact_inv[r] * fact_inv[n - r]) % M



    for k in range(1, n + 2):

        print(((nCr(n + 1, k, M) - nCr((l - 1) + (n + 1 - r), k - 1, M)) % M))



n = int(eval(input()))

l = [int(i) for i in input().split()]

x = [n] + l

D_11(x)
def d_11(N, A):  # N:整数の種類, A:数列

    M = 10**9 + 7  # 求めた解の剰余をこれで取る



    # 重複した数のインデックスを求める

    from collections import Counter

    c = Counter(A).most_common(n=1)[0][0]  # 重複した整数の値を取得

    index = [i for i, x in enumerate(A) if x == c]  # 重複した整数のインデックス

    l = index[0] + 1

    r = index[1] + 1



    # フェルマーの小定理を用いてコンビネーションを効率よく計算

    factrial = [1] * (N + 2)  # 0~N+1までの階乗のテーブルを作る

    for k in range(1, N + 2):

        factrial[k] = (factrial[k - 1] * k) % M



    fact_inv = [1] * (N + 2)

    fact_inv[N + 1] = pow(factrial[N + 1], M - 2, M)

    for k in range(N, -1, -1):

        fact_inv[k] = (fact_inv[k + 1] * (k + 1)) % M



    def nCr(n, r, M):

        if n < 0 or r < 0 or n < r:

            return 0

        else:

            return (factrial[n] * fact_inv[r] * fact_inv[n - r]) % M



    ans = ''

    for k in range(1, N + 2):

        ans += '{}\n'.format((nCr(N + 1, k, M) -

                              nCr((l - 1) + (N + 1 - r), k - 1, M)) % M)

    return ans[:-1]



N = int(eval(input()))

A = [int(i) for i in input().split()]

print((d_11(N, A)))
def D_11(x):
    n = x[0]  # 整数の数
    a = x[1:]  # 数列
    M = 10**9 + 7  # 求めた解の剰余をこれで取る
    s = set()
    result = [x for x in a if x in s or s.add(x)]
    # for x in a:
    # if x in s:
    #     result.append(x)
    # s.add(x) と同じ書き方
    index = [i for i, x in enumerate(a) if x == result[0]]
    l = index[0] + 1
    r = index[1] + 1
    # フェルマーの小定理を用いてコンビネーションを効率よく計算
    factrial = [1] * (n + 2)
    for k in range(1, n + 2):
        factrial[k] = (factrial[k - 1] * k) % M
    fact_inv = [1] * (n + 2)
    fact_inv[n + 1] = pow(factrial[n + 1], M - 2, M)
    for k in range(n, -1, -1):
        fact_inv[k] = (fact_inv[k + 1] * (k + 1)) % M
    # Mについて等式[(n-1)!]^(-1)=(n!)^(-1)*nの剰余を取ると
    # [(n-1)!]^(M-2)%M = [(n!)^(M-2)*n]%M になるからという感じ？
    def nCr(n, r, M):
        if n < 0 or r < 0 or n < r:
            return 0
        else:
            return (factrial[n] * fact_inv[r] * fact_inv[n - r]) % M

    for k in range(1, n + 2):
        print(((nCr(n + 1, k, M) - nCr((l - 1) + (n + 1 - r), k - 1, M)) % M))


n = int(eval(input()))
l = [int(i) for i in input().split()]
x = [n] + l
D_11(x)

def d_11(N, A):  # N:整数の種類, A:数列
    M = 10**9 + 7  # 求めた解の剰余をこれで取る
    # 重複した数のインデックスを求める
    from collections import Counter

    c = Counter(A).most_common(n=1)[0][0]  # 重複した整数の値を取得
    index = [i for i, x in enumerate(A) if x == c]  # 重複した整数のインデックス
    l = index[0] + 1
    r = index[1] + 1
    # フェルマーの小定理を用いてコンビネーションを効率よく計算
    factrial = [1] * (N + 2)  # 0~N+1までの階乗のテーブルを作る
    for k in range(1, N + 2):
        factrial[k] = (factrial[k - 1] * k) % M
    fact_inv = [1] * (N + 2)
    fact_inv[N + 1] = pow(factrial[N + 1], M - 2, M)
    for k in range(N, -1, -1):
        fact_inv[k] = (fact_inv[k + 1] * (k + 1)) % M

    def nCr(n, r, M):
        if n < 0 or r < 0 or n < r:
            return 0
        else:
            return (factrial[n] * fact_inv[r] * fact_inv[n - r]) % M

    ans = ""
    for k in range(1, N + 2):
        ans += "{}\n".format(
            (nCr(N + 1, k, M) - nCr((l - 1) + (N + 1 - r), k - 1, M)) % M
        )
    return ans[:-1]


N = int(eval(input()))
A = [int(i) for i in input().split()]
print((d_11(N, A)))

-def D_11(x): -    n = x[0]  # 整数の数 -    a = x[1:]  # 数列 +def d_11(N, A):  # N:整数の種類, A:数列 -    s = set() -    result = [x for x in a if x in s or s.add(x)] -    # for x in a: -    # if x in s: -    #     result.append(x) -    # s.add(x) と同じ書き方 -    index = [i for i, x in enumerate(a) if x == result[0]] +    # 重複した数のインデックスを求める +    from collections import Counter + +    c = Counter(A).most_common(n=1)[0][0]  # 重複した整数の値を取得 +    index = [i for i, x in enumerate(A) if x == c]  # 重複した整数のインデックス -    factrial = [1] * (n + 2) -    for k in range(1, n + 2): +    factrial = [1] * (N + 2)  # 0~N+1までの階乗のテーブルを作る +    for k in range(1, N + 2): -    fact_inv = [1] * (n + 2) -    fact_inv[n + 1] = pow(factrial[n + 1], M - 2, M) -    for k in range(n, -1, -1): +    fact_inv = [1] * (N + 2) +    fact_inv[N + 1] = pow(factrial[N + 1], M - 2, M) +    for k in range(N, -1, -1): -    # Mについて等式[(n-1)!]^(-1)=(n!)^(-1)*nの剰余を取ると -    # [(n-1)!]^(M-2)%M = [(n!)^(M-2)*n]%M になるからという感じ？ + -    for k in range(1, n + 2): -        print(((nCr(n + 1, k, M) - nCr((l - 1) + (n + 1 - r), k - 1, M)) % M)) +    ans = "" +    for k in range(1, N + 2): +        ans += "{}\n".format( +            (nCr(N + 1, k, M) - nCr((l - 1) + (N + 1 - r), k - 1, M)) % M +        ) +    return ans[:-1] -n = int(eval(input())) -l = [int(i) for i in input().split()] -x = [n] + l -D_11(x) +N = int(eval(input())) +A = [int(i) for i in input().split()] +print((d_11(N, A)))