# 最初dは与えられる距離だと思ってて「サンプルケース1は3じゃね？」とか思ってて2時間経過した

# 落ち着いて読んだら最小の辺の数だった



from collections import Counter



n = int(eval(input()))

arr = list(map(int, input().split()))

if arr[0] != 0:

    print((0))

    exit()

arr = sorted(list(Counter(arr).items()), key=lambda x: x[0])

if arr[0][1] > 1:

    print((0))

    exit()



mod = 998244353

ans = 1

tmp = 1

for i in range(1, len(arr)):

    if arr[i][0] != i:

        print((0))

        exit()

    ans *= pow(tmp, arr[i][1])

    ans %= mod

    tmp = arr[i][1]



print(ans)

n = int(eval(input()))

d = {}

mod = 998244353

max_v = 0

lis = list(map(int, input().split()))



# 先頭はかならず0

if lis[0] != 0:

    print((0))

    exit()



for v in lis:

    if v not in d:

        d[v] = 1

    else:

        d[v] += 1

    max_v = max(max_v, v)



# 0はひとつだけ

if 0 not in d or d[0] > 1:

    print((0))

    exit()



ans = 1

# 木を作ることができるならば1~max_vまでの数字がそれぞれ1つ以上存在する

for i in range(1, max_v + 1):

    if i not in d or i - 1 not in d:

        ans *= 0

    else:

        ans *= pow(d[i - 1], d[i], mod)

        ans %= mod

print(ans)
# 最初dは与えられる距離だと思ってて「サンプルケース1は3じゃね？」とか思ってて2時間経過した
# 落ち着いて読んだら最小の辺の数だった
from collections import Counter

n = int(eval(input()))
arr = list(map(int, input().split()))
if arr[0] != 0:
    print((0))
    exit()
arr = sorted(list(Counter(arr).items()), key=lambda x: x[0])
if arr[0][1] > 1:
    print((0))
    exit()
mod = 998244353
ans = 1
tmp = 1
for i in range(1, len(arr)):
    if arr[i][0] != i:
        print((0))
        exit()
    ans *= pow(tmp, arr[i][1])
    ans %= mod
    tmp = arr[i][1]
print(ans)

n = int(eval(input()))
d = {}
mod = 998244353
max_v = 0
lis = list(map(int, input().split()))
# 先頭はかならず0
if lis[0] != 0:
    print((0))
    exit()
for v in lis:
    if v not in d:
        d[v] = 1
    else:
        d[v] += 1
    max_v = max(max_v, v)
# 0はひとつだけ
if 0 not in d or d[0] > 1:
    print((0))
    exit()
ans = 1
# 木を作ることができるならば1~max_vまでの数字がそれぞれ1つ以上存在する
for i in range(1, max_v + 1):
    if i not in d or i - 1 not in d:
        ans *= 0
    else:
        ans *= pow(d[i - 1], d[i], mod)
        ans %= mod
print(ans)

-# 最初dは与えられる距離だと思ってて「サンプルケース1は3じゃね？」とか思ってて2時間経過した -# 落ち着いて読んだら最小の辺の数だった -from collections import Counter - -arr = list(map(int, input().split())) -if arr[0] != 0: +d = {} +mod = 998244353 +max_v = 0 +lis = list(map(int, input().split())) +# 先頭はかならず0 +if lis[0] != 0: -arr = sorted(list(Counter(arr).items()), key=lambda x: x[0]) -if arr[0][1] > 1: +for v in lis: +    if v not in d: +        d[v] = 1 +    else: +        d[v] += 1 +    max_v = max(max_v, v) +# 0はひとつだけ +if 0 not in d or d[0] > 1: -mod = 998244353 -tmp = 1 -for i in range(1, len(arr)): -    if arr[i][0] != i: -        print((0)) -        exit() -    ans *= pow(tmp, arr[i][1]) -    ans %= mod -    tmp = arr[i][1] +# 木を作ることができるならば1~max_vまでの数字がそれぞれ1つ以上存在する +for i in range(1, max_v + 1): +    if i not in d or i - 1 not in d: +        ans *= 0 +    else: +        ans *= pow(d[i - 1], d[i], mod) +        ans %= mod