unittest
{
	assert( [ "3", "1 2 1 3" ].parse.expand.solve == "3\n5\n4\n1" );
	assert( [ "1", "1 1" ].parse.expand.solve == "1\n1" );
	assert( [ "32", "29 19 7 10 26 32 27 4 11 20 2 8 16 23 5 14 6 12 17 22 18 30 28 24 15 1 25 3 13 21 19 31 9" ].parse.expand.solve == "32\n525\n5453\n40919\n237336\n1107568\n4272048\n13884156\n38567100\n92561040\n193536720\n354817320\n573166440\n818809200\n37158313\n166803103\n166803103\n37158313\n818809200\n573166440\n354817320\n193536720\n92561040\n38567100\n13884156\n4272048\n1107568\n237336\n40920\n5456\n528\n33\n1" );
}

import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	input.popFront;
	auto as = input.front.split.to!( long[] );
	return tuple( as );
}

auto solve( long[] as )
{
	// 二つある数を検索して、それより外側にある数の数を計算
	auto e = 0L;
	{
		auto ps = new long[ as.length ];
		foreach( i, a; as )
		{
			if( 0 < ps[ a ] )
			{
				e = ps[ a ] + as.length.signed - 2 - i;
				break;
			}
			ps[ a ] = i + 1;
		}
	}
	
	// 数列パターンを計算
	auto anss = new long[ as.length ];
	anss[ 0 ] = anss.length - 1;
	for( auto i = 1L; i < anss.length; i++ )
	{
		// 全パターンを計算
		anss[ i ] = anss.length.combinationMod( i + 1 );
		
		// 重複パターンを除外（二つある数の片方だけ取る かつ 二つある数の外側の数だけ取る）
		if( i <= e ) anss[ i ] = anss[ i ].subMod( e.combinationMod( i ) );
	}
	return anss.to!( string[] ).join( "\n" );
}

// 引き算
auto subMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return ( x + MOD - y ) % MOD;
}

// 掛け算
auto mulMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y % MOD;
}

// 割り算
auto divMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y.powMod!MOD( MOD - 2 ) % MOD;
}

// べき乗
auto powMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	auto a = 1L;
	for( ; 0 < y; y >>= 1 )
	{
		if( y & 1 ) a = a * x % MOD;
		x = x ^^ 2 % MOD;
	}
	return a;
}

// 階乗
auto factorialMod( long MOD = 10L ^^ 9 + 7 )( long x )
{
	static memo = [ 1L ];
	if( memo.length <= x )
	{
		auto i = memo.length;
		memo.length = x + 1;
		for( ; i <= x; i++ ) memo[ i ] = memo[ i - 1 ] * i % MOD;
	}
	return memo[ x ];
}

// 組み合わせ数
auto combinationMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x.factorialMod!MOD.divMod!MOD( y.factorialMod!MOD.mulMod!MOD( ( x - y ).factorialMod!MOD ) );
}
