← Home
For problem statement at 1000-1999/1600-1699/1600-1609/1605/problemF.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1600-1609/1605/verifierF.go ends with All 120 tests passed. can you fix the verifier? package main

import (
	"fmt"
)

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

	MOD := m

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

	maxKN := k
	if n > k {
		maxKN = n
	}
	C := make([][]int64, maxKN+1)
	for i := 0; i <= maxKN; i++ {
		C[i] = make([]int64, maxKN+1)
		C[i][0] = 1
		for j := 1; j <= i; j++ {
			C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD
		}
	}

	P_val := make([][]int64, k+1)
	P_val[0] = make([]int64, n+1)
	for K := 0; K <= n; K++ {
		P_val[0][K] = 0
	}
	P_val[0][0] = 1

	for diff := 1; diff <= k; diff++ {
		P_val[diff] = make([]int64, n+1)
		val := (power2[diff] - 1 + MOD) % MOD
		P_val[diff][0] = 1
		for K := 1; K <= n; K++ {
			P_val[diff][K] = (P_val[diff][K-1] * ((val - int64(K) + 1 + MOD) % MOD)) % MOD
		}
	}

	dp := make([][]int64, k+1)
	for i := 0; i <= k; i++ {
		dp[i] = make([]int64, n+1)
	}

	for i := 0; i <= k; i++ {
		for j := 0; j <= n; j++ {
			sum := int64(0)
			for m_ := 0; m_ < i; m_++ {
				diff := i - m_
				termSum := int64(0)
				for c := 0; c <= j; c++ {
					term := C[j][c] * dp[m_][c] % MOD
					term = term * P_val[diff][j-c] % MOD
					term = term * power2[m_*(j-c)] % MOD
					termSum += term
					if termSum >= MOD {
						termSum -= MOD
					}
				}
				sum += C[i][m_] * termSum % MOD
				if sum >= MOD {
					sum -= MOD
				}
			}
			dp[i][j] = (power2[i*j] - sum + MOD) % MOD
		}
	}

	ans := int64(0)

	if n%2 == 0 {
		for m_ := 0; m_ <= k; m_++ {
			term := C[k][m_] * dp[m_][n] % MOD
			ans = (ans + term) % MOD
		}
	} else {
		for m_ := 0; m_ <= k; m_++ {
			term1 := dp[m_][n]

			term2 := int64(0)
			if n >= 1 {
				term2 = int64(n) * dp[m_][n-1] % MOD
				term2 = term2 * P_val[k-m_][1] % MOD
				term2 = term2 * power2[m_] % MOD
			}

			term := (term1 + term2) % MOD
			term = C[k][m_] * term % MOD
			ans = (ans + term) % MOD
		}
	}

	fmt.Println(ans)
}