← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD = 998244353
const MAXN = 200005

var fact, invFact, pow2, inv [MAXN]int

func powMod(a, b int) int {
	res := 1
	for b > 0 {
		if b&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		b >>= 1
	}
	return res
}

func init() {
	fact[0] = 1
	for i := 1; i < MAXN; i++ {
		fact[i] = fact[i-1] * i % MOD
	}
	invFact[MAXN-1] = powMod(fact[MAXN-1], MOD-2)
	for i := MAXN - 2; i >= 0; i-- {
		invFact[i] = invFact[i+1] * (i + 1) % MOD
	}
	pow2[0] = 1
	for i := 1; i < MAXN; i++ {
		pow2[i] = pow2[i-1] * 2 % MOD
	}
	inv[1] = 1
	for i := 2; i < MAXN; i++ {
		inv[i] = MOD - MOD/i*inv[MOD%i]%MOD
	}
}

func C(n, k int) int {
	if k < 0 || k > n {
		return 0
	}
	return fact[n] * invFact[k] % MOD * invFact[n-k] % MOD
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var t int
	fmt.Fscan(reader, &t)

	for ; t > 0; t-- {
		var n int
		var s string
		fmt.Fscan(reader, &n)
		fmt.Fscan(reader, &s)

		zeros := 0
		ones := 0
		maxL := 0
		maxZerosFor1 := 0
		ans := 0

		for j := 1; j <= n; j++ {
			if s[j-1] == '0' {
				zeros++
				if ones > maxL {
					maxL = ones
				}
			} else {
				ones++
				if zeros > maxZerosFor1 {
					maxZerosFor1 = zeros
				}
			}

			lb := maxL
			ub := j - 1 - maxZerosFor1

			if lb > ub {
				continue
			}

			var sum int
			if lb == 0 && ub == j-1 {
				sum = pow2[j-1]
			} else {
				sum = 0
				c := C(j-1, lb)
				for h := lb; h <= ub; h++ {
					sum = (sum + c) % MOD
					if h < ub {
						c = c * (j - 1 - h) % MOD * inv[h+1] % MOD
					}
				}
			}
			ans = (ans + sum) % MOD
		}

		fmt.Fprintln(writer, ans)
	}
}
```