← Home
For problem statement at 0-999/900-999/970-979/979/problemE.txt this is a correct solution, but verifier at 0-999/900-999/970-979/979/verifierE.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
)

func main() {
	var n, p int
	if _, err := fmt.Scan(&n, &p); err != nil {
		return
	}

	c := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Scan(&c[i])
	}

	MOD := 1000000007

	pow2 := make([]int, n+1)
	pow2[0] = 1
	for i := 1; i <= n; i++ {
		pow2[i] = (pow2[i-1] * 2) % MOD
	}

	dp := make([][][]int, 2)
	for i := 0; i < 2; i++ {
		dp[i] = make([][]int, 2)
		for j := 0; j < 2; j++ {
			dp[i][j] = make([]int, 2)
		}
	}

	dp[0][0][0] = 1

	for i := 1; i <= n; i++ {
		nextDp := make([][][]int, 2)
		for j := 0; j < 2; j++ {
			nextDp[j] = make([][]int, 2)
			for k := 0; k < 2; k++ {
				nextDp[j][k] = make([]int, 2)
			}
		}

		for color := 0; color <= 1; color++ {
			if c[i] != -1 && c[i] != color {
				continue
			}

			for h0 := 0; h0 <= 1; h0++ {
				for h1 := 0; h1 <= 1; h1++ {
					for par := 0; par <= 1; par++ {
						ways := dp[h0][h1][par]
						if ways == 0 {
							continue
						}

						var oppH int
						if color == 0 {
							oppH = h1
						} else {
							oppH = h0
						}

						if oppH == 0 {
							nextWays := (ways * pow2[i-1]) % MOD
							newPar := par ^ 1
							newH0 := h0
							if color == 0 {
								newH0 = 1
							}
							newH1 := h1
							if color == 1 {
								newH1 = 1
							}
							nextDp[newH0][newH1][newPar] = (nextDp[newH0][newH1][newPar] + nextWays) % MOD
						} else {
							nextWays := (ways * pow2[i-2]) % MOD
							
							newPar0 := par
							newH0_0 := h0
							newH1_0 := h1
							nextDp[newH0_0][newH1_0][newPar0] = (nextDp[newH0_0][newH1_0][newPar0] + nextWays) % MOD

							newPar1 := par ^ 1
							newH0_1 := h0
							if color == 0 {
								newH0_1 = 1
							}
							newH1_1 := h1
							if color == 1 {
								newH1_1 = 1
							}
							nextDp[newH0_1][newH1_1][newPar1] = (nextDp[newH0_1][newH1_1][newPar1] + nextWays) % MOD
						}
					}
				}
			}
		}
		dp = nextDp
	}

	ans := 0
	for h0 := 0; h0 <= 1; h0++ {
		for h1 := 0; h1 <= 1; h1++ {
			ans = (ans + dp[h0][h1][p]) % MOD
		}
	}

	fmt.Println(ans)
}