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