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

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

func powMod(a, e, mod int64) int64 {
	a %= mod
	res := int64(1 % mod)
	for e > 0 {
		if e&1 == 1 {
			res = res * a % mod
		}
		a = a * a % mod
		e >>= 1
	}
	return res
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var n, m int
	fmt.Fscan(in, &n, &m)

	var k int
	fmt.Fscan(in, &k)

	rowCnt := make([]int, n+1)
	colCnt := make([]int, m+1)
	rowXor := make([]int, n+1)
	colXor := make([]int, m+1)

	for i := 0; i < k; i++ {
		var a, b, c int
		fmt.Fscan(in, &a, &b, &c)
		rowCnt[a]++
		colCnt[b]++
		if c == -1 {
			rowXor[a] ^= 1
			colXor[b] ^= 1
		}
	}

	var p int64
	fmt.Fscan(in, &p)

	if (n^m)&1 == 1 {
		fmt.Fprintln(out, 0)
		return
	}

	t := 0

	for i := 1; i <= n; i++ {
		if rowCnt[i] == m {
			if rowXor[i] != 1 {
				fmt.Fprintln(out, 0)
				return
			}
			t++
		}
	}

	for j := 1; j <= m; j++ {
		if colCnt[j] == n {
			if colXor[j] != 1 {
				fmt.Fprintln(out, 0)
				return
			}
			t++
		}
	}

	exp := int64(n)*int64(m) - int64(k) - int64(n) - int64(m) + 1 + int64(t)
	fmt.Fprintln(out, powMod(2, exp, p))
}