← Home
For problem statement at 1000-1999/1500-1599/1510-1519/1517/problemF.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1510-1519/1517/verifierF.go ends with All tests passed can you fix the verifier? package main

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

const MOD = 998244353

type StateC struct {
	min_c int
	max_c int
	val   int64
}

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(reader, &n)

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

	var postOrder []int
	parent := make([]int, n+1)

	var dfs func(u, p int)
	dfs = func(u, p int) {
		parent[u] = p
		for _, v := range adj[u] {
			if v != p {
				dfs(v, u)
			}
		}
		postOrder = append(postOrder, u)
	}
	dfs(1, 0)

	var dp [305][605]int64
	var hc [305]int
	var newDP [605]int64
	var validC [605]StateC

	sumDr := int64(0)

	for r := 0; r <= n; r++ {
		for i := 1; i <= n; i++ {
			for j := 0; j <= 2*r+1; j++ {
				dp[i][j] = 0
			}
			hc[i] = 0
		}

		for _, u := range postOrder {
			dp[u][0] = 1
			dp[u][r+1] = 1
			hu := 0

			for _, c := range adj[u] {
				if c == parent[u] {
					continue
				}

				for i := 0; i <= 2*r+1; i++ {
					newDP[i] = 0
				}

				lim1_1 := hu
				if r < lim1_1 {
					lim1_1 = r
				}
				lim1_2 := hu + r + 1
				if 2*r+1 < lim1_2 {
					lim1_2 = 2*r+1
				}

				lim2_1 := hc[c]
				if r < lim2_1 {
					lim2_1 = r
				}
				lim2_2 := hc[c] + r + 1
				if 2*r+1 < lim2_2 {
					lim2_2 = 2*r+1
				}

				countC := 0
				for s2 := 0; s2 <= lim2_1; s2++ {
					if dp[c][s2] > 0 {
						validC[countC] = StateC{min_c: s2 + 1, max_c: -1, val: dp[c][s2]}
						countC++
					}
				}
				for s2 := r + 1; s2 <= lim2_2; s2++ {
					if dp[c][s2] > 0 {
						max_c := s2 - r
						if max_c > r {
							continue
						}
						validC[countC] = StateC{min_c: 1000000, max_c: max_c, val: dp[c][s2]}
						countC++
					}
				}

				for s1 := 0; s1 <= lim1_1; s1++ {
					val1 := dp[u][s1]
					if val1 == 0 {
						continue
					}
					for i := 0; i < countC; i++ {
						vc := &validC[i]
						new_min := s1
						if vc.min_c < new_min {
							new_min = vc.min_c
						}
						new_max := vc.max_c

						if new_min+new_max <= r {
							new_max = -1
						}

						new_s := new_min
						if new_max != -1 {
							new_s = new_max + r + 1
						}

						newDP[new_s] = (newDP[new_s] + val1*vc.val) % MOD
					}
				}

				for s1 := r + 1; s1 <= lim1_2; s1++ {
					val1 := dp[u][s1]
					if val1 == 0 {
						continue
					}
					max_u := s1 - r - 1
					for i := 0; i < countC; i++ {
						vc := &validC[i]
						new_min := vc.min_c
						new_max := max_u
						if vc.max_c > new_max {
							new_max = vc.max_c
						}

						if new_min+new_max <= r {
							new_max = -1
						}

						new_s := new_min
						if new_max != -1 {
							new_s = new_max + r + 1
						}

						newDP[new_s] = (newDP[new_s] + val1*vc.val) % MOD
					}
				}

				for i := 0; i <= 2*r+1; i++ {
					dp[u][i] = newDP[i]
				}
				if hc[c]+1 > hu {
					hu = hc[c] + 1
				}
			}
			hc[u] = hu
		}

		dr := int64(0)
		root := postOrder[n-1]
		for s := 0; s <= r; s++ {
			dr = (dr + dp[root][s]) % MOD
		}
		sumDr = (sumDr + dr) % MOD
	}

	inv2n := power(power(2, int64(n)), MOD-2)
	ans := (int64(n) - (sumDr*inv2n)%MOD + MOD) % MOD
	fmt.Println(ans)
}