It is Borya's eleventh birthday, and he has got a great present: n cards with numbers. The i-th card has the number a_{i} written on it. Borya wants to put his cards in a row to get one greater number. For example, if Borya has cards with numbers 1, 31, and 12, and he puts them in a row in this order, he would get a number 13112.

He is only 11, but he already knows that there are n! ways to put his cards in a row. But today is a special day, so he is only interested in such ways that the resulting big number is divisible by eleven. So, the way from the previous paragraph is good, because 13112 = 1192 × 11, but if he puts the cards in the following order: 31, 1, 12, he would get a number 31112, it is not divisible by 11, so this way is not good for Borya. Help Borya to find out how many good ways to put the cards are there.

Borya considers all cards different, even if some of them contain the same number. For example, if Borya has two cards with 1 on it, there are two good ways.

Help Borya, find the number of good ways to put the cards. This number can be large, so output it modulo 998244353.


-----Input-----

Input data contains multiple test cases. The first line of the input data contains an integer t — the number of test cases (1 ≤ t ≤ 100). The descriptions of test cases follow.

Each test is described by two lines.

The first line contains an integer n (1 ≤ n ≤ 2000) — the number of cards in Borya's present.

The second line contains n integers a_{i} (1 ≤ a_{i} ≤ 10^9) — numbers written on the cards.

It is guaranteed that the total number of cards in all tests of one input data doesn't exceed 2000.


-----Output-----

For each test case output one line: the number of ways to put the cards to the table so that the resulting big number was divisible by 11, print the number modulo 998244353.


-----Example-----
Input
4
2
1 1
3
1 31 12
3
12345 67 84
9
1 2 3 4 5 6 7 8 9

Output
2
2
2
31680

Source: codeforces | Difficulty: VERY_HARD
Tags: Dynamic programming

Combinatorics

Mathematics


Solutions:
mod = 998244353
f0 = [[0 for i in range(11)] for j in range(2010)]
f1 = [[0 for i in range(11)] for j in range(2010)]
fac = [0 for i in range(2010)]
tab = [0 for i in range(11)]
C = [[0 for i in range(2010)] for j in range(2010)]

def Init():
	fac[0] = 1
	for i in range(2010):
		if i > 0:
			fac[i] = fac[i - 1] * i % mod
		C[i][0] = 1
		for j in range(1, 2010):
			C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod

def len(x):
	res = 0
	while x > 0:
		res += 1
		x = x // 10
	return res

def solve():
	n = int(input())
	f0[0][0] = f1[0][0] = 1
	a = list(map(int, input().split()))
	(c0, c1) = (0, 0)
	(s0, s1) = (0, 0)
	for nu in a:
		m = nu % 11
		if len(nu) & 1:
			c1 += 1
			s1 += m
			for i in range(11):
				f1[c1][i] = 0
			for i in range(c1 - 1, -1, -1):
				for j in range(11):
					if f1[i][j] == 0:
						continue
					f1[i + 1][(j + m) % 11] += f1[i][j]
					f1[i + 1][(j + m) % 11] %= mod
		else:
			c0 += 1
			s0 += m
			for i in range(11):
				f0[c0][i] = 0
			for i in range(c0 - 1, -1, -1):
				for j in range(11):
					if f0[i][j] == 0:
						continue
					f0[i + 1][(j + m) % 11] += f0[i][j]
					f0[i + 1][(j + m) % 11] %= mod
	s1 %= 11
	s0 %= 11
	part = c1 // 2
	for i in range(11):
		tab[i] = 0
	for i in range(11):
		tab[(i + i + 11 - s1) % 11] = f1[c1 - part][i]
	for i in range(11):
		tab[i] = tab[i] * fac[part] % mod * fac[c1 - part] % mod
	ans = 0
	if c1 == 0:
		ans = f0[c0][0] * fac[c0]
	elif c0 == 0:
		ans = tab[0]
	else:
		for i in range(c0 + 1):
			for j in range(11):
				if f0[i][j] == 0:
					continue
				ans = (ans + fac[i] % mod * fac[c0 - i] % mod * f0[i][j] * tab[(j + j + 11 - s0) % 11] % mod * C[i + (c1 - part) - 1][c1 - part - 1] % mod * C[part + c0 - i][part]) % mod
	print(ans)
Init()
T = int(input())
for ttt in range(T):
	solve()