← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

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

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	children := make([][]int, n+1)
	for i := 2; i <= n; i++ {
		scanner.Scan()
		p, _ := strconv.Atoi(scanner.Text())
		children[p] = append(children[p], i)
	}

	const M = 1000000007

	dpDown := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		dpDown[i] = 1
	}

	for i := n; i >= 1; i-- {
		for _, v := range children[i] {
			dpDown[i] = (dpDown[i] * (dpDown[v] + 1)) % M
		}
	}

	dpUp := make([]int64, n+1)
	pref := make([]int64, n+1)
	suff := make([]int64, n+1)

	for u := 1; u <= n; u++ {
		k := len(children[u])
		if k == 0 {
			continue
		}

		pref[0] = (dpDown[children[u][0]] + 1) % M
		for i := 1; i < k; i++ {
			pref[i] = (pref[i-1] * (dpDown[children[u][i]] + 1)) % M
		}

		suff[k-1] = (dpDown[children[u][k-1]] + 1) % M
		for i := k - 2; i >= 0; i-- {
			suff[i] = (suff[i+1] * (dpDown[children[u][i]] + 1)) % M
		}

		upPlusOne := dpUp[u] + 1
		for i := 0; i < k; i++ {
			v := children[u][i]
			pVal := int64(1)
			if i > 0 {
				pVal = pref[i-1]
			}
			sVal := int64(1)
			if i < k-1 {
				sVal = suff[i+1]
			}
			dpUp[v] = (((pVal * sVal) % M) * upPlusOne) % M
		}
	}

	var out strings.Builder
	for i := 1; i <= n; i++ {
		ans := (dpDown[i] * (dpUp[i] + 1)) % M
		out.WriteString(strconv.FormatInt(ans, 10))
		if i < n {
			out.WriteByte(' ')
		}
	}
	out.WriteByte('\n')
	fmt.Print(out.String())
}
```