← Home
For problem statement at 1000-1999/1400-1499/1450-1459/1450/problemH1.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1450-1459/1450/verifierH1.go ends with All tests passed can you fix the verifier? package main

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

const MOD = 998244353

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

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

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

	var s string
	fmt.Fscan(reader, &s)

	kVal := 0
	q := 0

	for i := 0; i < n; i++ {
		if s[i] == '?' {
			q++
		} else {
			val := 0
			if s[i] == 'b' {
				val = 1
			} else {
				val = -1
			}
			if i%2 != 0 {
				val = -val
			}
			kVal += val
		}
	}

	fact := make([]int64, n+1)
	invFact := make([]int64, n+1)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= n; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[n] = power(fact[n], MOD-2)
	for i := n - 1; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}

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

	ans := int64(0)
	for k := 0; k <= q; k++ {
		y := 2*k - q
		sum := kVal + y
		if sum%4 == 0 {
			term := int64(abs(sum) / 4) % MOD
			ways := nCr(q, k)
			ans = (ans + term*ways) % MOD
		}
	}

	denom := power(2, int64(q-1))
	invDenom := power(denom, MOD-2)
	ans = (ans * invDenom) % MOD

	fmt.Println(ans)
}