```go
package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
var (
fact []int64
invFact []int64
pow2 []int64
)
func init() {
maxN := 200005
fact = make([]int64, maxN)
invFact = make([]int64, maxN)
pow2 = make([]int64, maxN)
fact[0] = 1
invFact[0] = 1
pow2[0] = 1
for i := 1; i < maxN; i++ {
fact[i] = (fact[i-1] * int64(i)) % MOD
pow2[i] = (pow2[i-1] * 2) % MOD
}
invFact[maxN-1] = power(fact[maxN-1], MOD-2)
for i := maxN - 2; i >= 1; i-- {
invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
}
}
func power(base, exp int64) int64 {
res := int64(1)
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func nCr(n, r int) int64 {
if r < 0 || r > n {
return 0
}
return fact[n] * invFact[r] % MOD * invFact[n-r] % MOD
}
func solve(reader *bufio.Reader, writer *bufio.Writer) {
var n int
fmt.Fscan(reader, &n)
cnt := make([]int, n)
for i := 0; i < n; i++ {
var val int
fmt.Fscan(reader, &val)
cnt[val]++
}
if cnt[0] == 0 {
fmt.Fprintln(writer, 0)
return
}
suffixSum := n
// Handling v=0
c0 := cnt[0]
L := c0
currentP := make([]int64, L+1)
// Compute W(c0, k) for k=1..L
// W(c, k) = sum_{j=k}^c nCr(c, j)
var wVal int64 = 0
for k := c0; k >= 1; k-- {
wVal = (wVal + nCr(c0, k)) % MOD
currentP[k] = wVal
}
suffixSum -= c0
var ans int64 = 0
var sumP int64 = 0
for k := 1; k <= L; k++ {
sumP = (sumP + currentP[k]) % MOD
}
ans = (ans + sumP*pow2[suffixSum]) % MOD
// Iterate v > 0
for v := 1; v < n; v++ {
c := cnt[v]
if c == 0 {
break
}
if c < L {
L = c
}
// Update P using W(c, k)
// We compute W(c, k) on the fly to avoid O(N) memory allocation per step
wVal = 0
// Start wVal as sum_{j=L+1}^c nCr(c, j)
for j := c; j > L; j-- {
wVal = (wVal + nCr(c, j)) % MOD
}
newSumP := int64(0)
for k := L; k >= 1; k-- {
wVal = (wVal + nCr(c, k)) % MOD
currentP[k] = (currentP[k] * wVal) % MOD
newSumP = (newSumP + currentP[k]) % MOD
}
sumP = newSumP
suffixSum -= c
ans = (ans + sumP*pow2[suffixSum]) % MOD
}
fmt.Fprintln(writer, ans)
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
fmt.Fscan(reader, &t)
for i := 0; i < t; i++ {
solve(reader, writer)
}
}
```