← Home
package main

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

const MOD = 998244353

var fact, invFact []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 initFacts(maxN int) {
	fact = make([]int64, maxN+1)
	invFact = make([]int64, maxN+1)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= maxN; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[maxN] = power(fact[maxN], MOD-2)
	for i := maxN - 1; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}
}

func main() {
	initFacts(5005)
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buffer := make([]byte, 1024*1024)
	scanner.Buffer(buffer, 1024*1024)

	scanInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}
	tStr := scanner.Bytes()
	t := 0
	for _, b := range tStr {
		t = t*10 + int(b-'0')
	}

	for tc := 0; tc < t; tc++ {
		n := scanInt()
		fa := make([]int, n+1)
		for i := 2; i <= n; i++ {
			fa[i] = scanInt()
		}
		a := make([]int, n+1)
		for i := 1; i <= n; i++ {
			a[i] = scanInt()
		}

		depth := make([]int, n+1)
		depth[0] = -1
		depth[1] = 0
		for i := 2; i <= n; i++ {
			depth[i] = depth[fa[i]] + 1
		}

		sorted_anc := make([][]int, n+1)
		sorted_anc[1] = []int{1}
		for i := 2; i <= n; i++ {
			p := fa[i]
			a_i := a[i]
			sorted_anc[i] = make([]int, len(sorted_anc[p])+1)
			copy(sorted_anc[i][:a_i], sorted_anc[p][:a_i])
			sorted_anc[i][a_i] = i
			copy(sorted_anc[i][a_i+1:], sorted_anc[p][a_i:])
		}

		S := make([][]int, 2*n+1)
		for i := 2; i <= n; i++ {
			p := fa[i]
			a_i := a[i]
			var L, R int
			if a_i == 0 {
				L = 0
			} else {
				L = sorted_anc[p][a_i-1]
			}
			if a_i == len(sorted_anc[p]) {
				R = 0
			} else {
				R = sorted_anc[p][a_i]
			}

			var creator, dir int
			if depth[L] > depth[R] {
				creator = L
				dir = 1
			} else {
				creator = R
				dir = 0
			}

			id := 2 * creator
			if dir == 0 {
				id -= 1
			}
			S[id] = append(S[id], i)
		}
		S[0] = []int{1}

		ans := int64(1)
		var dfs func(int) int
		dfs = func(id int) int {
			size_I := 0
			for _, u := range S[id] {
				size_L := dfs(2*u - 1)
				size_R := dfs(2 * u)
				B_u := 1 + size_L + size_R
				size_I += B_u
				ans = (ans * invFact[B_u]) % MOD
			}
			ans = (ans * fact[size_I]) % MOD
			return size_I
		}
		dfs(0)

		fmt.Println(ans)
	}
}