← Home
For problem statement at 0-999/700-799/760-769/762/problemF.txt this is a correct solution, but verifier at 0-999/700-799/760-769/762/verifierF.go ends with All tests passed. can you fix the verifier? package main

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

const MOD = 1000000007

func power(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
}

func modInverse(n int) int {
	return power(n, MOD-2)
}

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

	adjS := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		adjS[u] = append(adjS[u], v)
		adjS[v] = append(adjS[v], u)
	}

	var m int
	if _, err := fmt.Fscan(reader, &m); err != nil {
		return
	}

	adjT := make([][]int, m+1)
	for i := 0; i < m-1; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		adjT[u] = append(adjT[u], v)
		adjT[v] = append(adjT[v], u)
	}

	children := make([][]int, m+1)
	var dfsT func(u, p int)
	dfsT = func(u, p int) {
		for _, v := range adjT[u] {
			if v != p {
				children[u] = append(children[u], v)
				dfsT(v, u)
			}
		}
	}
	dfsT(1, 0)

	solve := func(targetAdj [][]int) int {
		targetNodes := len(targetAdj) - 1
		memo := make(map[int]int)

		var dp func(x, u, p int) int
		dp = func(x, u, p int) int {
			state := (x * 2000000) + (p * 2000) + u
			if val, exists := memo[state]; exists {
				return val
			}

			C := children[x]
			k := len(C)

			var N []int
			for _, v := range targetAdj[u] {
				if v != p {
					N = append(N, v)
				}
			}
			if k > len(N) {
				memo[state] = 0
				return 0
			}

			match_dp := make([]int, 1<<k)
			match_dp[0] = 1

			for _, v := range N {
				next_dp := make([]int, 1<<k)
				copy(next_dp, match_dp)
				for mask := 0; mask < (1 << k); mask++ {
					if match_dp[mask] == 0 {
						continue
					}
					for i := 0; i < k; i++ {
						if (mask & (1 << i)) == 0 {
							nmask := mask | (1 << i)
							val := dp(C[i], v, u)
							next_dp[nmask] = (next_dp[nmask] + match_dp[mask]*val) % MOD
						}
					}
				}
				match_dp = next_dp
			}

			ans := match_dp[(1<<k)-1]
			memo[state] = ans
			return ans
		}

		total := 0
		for u := 1; u <= targetNodes; u++ {
			total = (total + dp(1, u, 0)) % MOD
		}
		return total
	}

	totalS := solve(adjS)
	totalAut := solve(adjT)

	ans := (totalS * modInverse(totalAut)) % MOD
	fmt.Println(ans)
}