← Home
For problem statement at 1000-1999/1500-1599/1550-1559/1554/problemE.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1550-1559/1554/verifierE.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"sort"
)

const MOD int64 = 998244353

func readAll() []byte {
	data, _ := io.ReadAll(os.Stdin)
	return data
}

type Reader struct {
	data []byte
	pos  int
	n    int
}

func NewReader() *Reader {
	d := readAll()
	return &Reader{data: d, pos: 0, n: len(d)}
}

func (r *Reader) nextInt() int {
	n := r.n
	data := r.data
	pos := r.pos

	for pos < n && (data[pos] < '0' || data[pos] > '9') && data[pos] != '-' {
		pos++
	}
	sign := 1
	if pos < n && data[pos] == '-' {
		sign = -1
		pos++
	}
	val := 0
	for pos < n && data[pos] >= '0' && data[pos] <= '9' {
		val = val*10 + int(data[pos]-'0')
		pos++
	}
	r.pos = pos
	return val * sign
}

func getDivisors(x int) []int {
	ds := []int{}
	for i := 1; i*i <= x; i++ {
		if x%i == 0 {
			ds = append(ds, i)
			if i*i != x {
				ds = append(ds, x/i)
			}
		}
	}
	sort.Ints(ds)
	return ds
}

func main() {
	in := NewReader()
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	t := in.nextInt()

	maxN := 300000 + 5
	pow2 := make([]int64, maxN)
	pow2[0] = 1
	for i := 1; i < maxN; i++ {
		pow2[i] = (pow2[i-1] * 2) % MOD
	}

	for ; t > 0; t-- {
		n := in.nextInt()
		adj := make([][]int, n+1)
		for i := 0; i < n-1; i++ {
			u := in.nextInt()
			v := in.nextInt()
			adj[u] = append(adj[u], v)
			adj[v] = append(adj[v], u)
		}

		// Build parent and order once
		parent := make([]int, n+1)
		order := make([]int, 0, n)
		stack := []int{1}
		parent[1] = -1
		for len(stack) > 0 {
			u := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			order = append(order, u)
			for _, v := range adj[u] {
				if v == parent[u] || parent[v] != 0 {
					continue
				}
				parent[v] = u
				stack = append(stack, v)
			}
		}

		g := make([]int64, n+1)
		g[1] = pow2[n-1]

		ds := getDivisors(n - 1)
		ok := make([]bool, n+1)
		isZero := make([]bool, n+1)

		for _, k := range ds {
			if k == 1 {
				continue
			}
			// DP per k
			for i := range ok {
				ok[i] = false
				isZero[i] = false
			}
			valid := true
			for i := n - 1; i >= 0; i-- {
				u := order[i]
				s := 0
				okU := true
				for _, v := range adj[u] {
					if v == parent[u] {
						continue
					}
					if !ok[v] {
						okU = false
						break
					}
					if isZero[v] {
						s++
					}
				}
				if !okU {
					ok[u] = false
					continue
				}
				r := s % k
				if r == 0 {
					ok[u] = true
					isZero[u] = true
				} else if r == k-1 {
					ok[u] = true
					isZero[u] = false
				} else {
					ok[u] = false
				}
			}
			if !(ok[1] && isZero[1]) {
				valid = false
			}
			if valid {
				g[k] = 1
			} else {
				g[k] = 0
			}
		}

		ans := make([]int64, n+1)
		for k := n; k >= 1; k-- {
			res := g[k]
			for m := 2; k*m <= n; m++ {
				res -= ans[k*m]
			}
			res %= MOD
			if res < 0 {
				res += MOD
			}
			ans[k] = res
		}

		for k := 1; k <= n; k++ {
			if k > 1 {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, ans[k]%MOD)
		}
		fmt.Fprintln(out)
	}
}
```