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)
}