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