← Home
For problem statement at 1000-1999/1600-1699/1670-1679/1672/problemG.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1670-1679/1672/verifierG.go ends with case 8 failed
input:
3 1
?
0
0
expected: 0
got: 1

exit status 1 can you fix the verifier? ```go
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var r, c int
	if _, err := fmt.Fscan(reader, &r, &c); err != nil {
		return
	}

	b := make([]string, r)
	k := 0
	for i := 0; i < r; i++ {
		fmt.Fscan(reader, &b[i])
		for j := 0; j < c; j++ {
			if b[i][j] == '?' {
				k++
			}
		}
	}

	MOD := 998244353

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

	if r%2 == 0 && c%2 == 0 {
		fmt.Println(power(2, k))
		return
	}

	if r%2 == 1 && c%2 == 0 {
		ans := 0
		for S := 0; S <= 1; S++ {
			ways := 1
			for j := 0; j < c; j++ {
				q := 0
				sum := 0
				for i := 0; i < r; i++ {
					if b[i][j] == '?' {
						q++
					} else {
						sum += int(b[i][j] - '0')
					}
				}
				sum %= 2
				if q > 0 {
					ways = (ways * power(2, q-1)) % MOD
				} else {
					if sum != S {
						ways = 0
					}
				}
			}
			ans = (ans + ways) % MOD
		}
		fmt.Println(ans)
		return
	}

	if r%2 == 0 && c%2 == 1 {
		ans := 0
		for S := 0; S <= 1; S++ {
			ways := 1
			for i := 0; i < r; i++ {
				q := 0
				sum := 0
				for j := 0; j < c; j++ {
					if b[i][j] == '?' {
						q++
					} else {
						sum += int(b[i][j] - '0')
					}
				}
				sum %= 2
				if q > 0 {
					ways = (ways * power(2, q-1)) % MOD
				} else {
					if sum != S {
						ways = 0
					}
				}
			}
			ans = (ans + ways) % MOD
		}
		fmt.Println(ans)
		return
	}

	if r%2 == 1 && c%2 == 1 {
		parent := make([]int, r+c)
		for i := 0; i < r+c; i++ {
			parent[i] = i
		}
		var find func(int) int
		find = func(i int) int {
			if parent[i] == i {
				return i
			}
			parent[i] = find(parent[i])
			return parent[i]
		}
		union := func(i, j int) {
			rootI := find(i)
			rootJ := find(j)
			if rootI != rootJ {
				parent[rootI] = rootJ
			}
		}

		edges := 0
		for i := 0; i < r; i++ {
			for j := 0; j < c; j++ {
				if b[i][j] == '?' {
					edges++
					union(i, r+j)
				}
			}
		}

		comps := 0
		for i := 0; i < r+c; i++ {
			if parent[i] == i {
				comps++
			}
		}

		ans := 0
		for S := 0; S <= 1; S++ {
			req := make([]int, r+c)
			for i := 0; i < r; i++ {
				sum := 0
				for j := 0; j < c; j++ {
					if b[i][j] != '?' {
						sum += int(b[i][j] - '0')
					}
				}
				req[i] = (S - sum%2 + 2) % 2
			}
			for j := 0; j < c; j++ {
				sum := 0
				for i := 0; i < r; i++ {
					if b[i][j] != '?' {
						sum += int(b[i][j] - '0')
					}
				}
				req[r+j] = (S - sum%2 + 2) % 2
			}

			compSum := make([]int, r+c)
			for i := 0; i < r+c; i++ {
				compSum[find(i)] += req[i]
			}

			valid := true
			for i := 0; i < r+c; i++ {
				if parent[i] == i && compSum[i]%2 != 0 {
					valid = false
					break
				}
			}

			if valid {
				ans = (ans + power(2, edges-(r+c-comps))) % MOD
			}
		}
		fmt.Println(ans)
		return
	}
}
```