← Home
For problem statement at 1000-1999/1600-1699/1600-1609/1608/problemD.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1600-1609/1608/verifierD.go ends with All tests passed can you fix the verifier? package main

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

const MOD = 998244353

var fact, invFact []int64

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func modInverse(n int64) int64 {
	return power(n, MOD-2)
}

func precompute(maxN int) {
	fact = make([]int64, maxN+1)
	invFact = make([]int64, maxN+1)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= maxN; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[maxN] = modInverse(fact[maxN])
	for i := maxN - 1; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}
}

func nCr(n, r int) int64 {
	if r < 0 || r > n {
		return 0
	}
	num := fact[n]
	den := (invFact[r] * invFact[n-r]) % MOD
	return (num * den) % MOD
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(reader, &n)

	precompute(2*n + 5)

	var fixed_L_W, fixed_R_B, q_L, q_R int

	allWB_or_BW := int64(1)
	can_all_WB := true
	can_all_BW := true

	for i := 0; i < n; i++ {
		var s string
		fmt.Fscan(reader, &s)
		l := s[0]
		r := s[1]

		if l == 'W' {
			fixed_L_W++
		} else if l == '?' {
			q_L++
		}

		if r == 'B' {
			fixed_R_B++
		} else if r == '?' {
			q_R++
		}

		if s == "??" {
			allWB_or_BW = (allWB_or_BW * 2) % MOD
		} else if s == "WW" || s == "BB" {
			allWB_or_BW = 0
		}

		if l == 'B' || r == 'W' {
			can_all_WB = false
		}

		if l == 'W' || r == 'B' {
			can_all_BW = false
		}
	}

	ans := nCr(q_L+q_R, q_R+fixed_R_B-fixed_L_W)

	bad := allWB_or_BW
	if can_all_WB {
		bad = (bad - 1 + MOD) % MOD
	}
	if can_all_BW {
		bad = (bad - 1 + MOD) % MOD
	}

	ans = (ans - bad + MOD) % MOD

	fmt.Println(ans)
}