For problem statement at 2000-2999/2100-2199/2160-2169/2164/problemF1.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2160-2169/2164/verifierF1.go ends with All 85 tests passed can you fix the verifier? 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)
}
}