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)
}