← Home
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	fmt.Fscan(reader, &n)

	adj := make([][]int, n+1)
	for i := 2; i <= n; i++ {
		var p int
		fmt.Fscan(reader, &p)
		adj[p] = append(adj[p], i)
		adj[i] = append(adj[i], p)
	}

	dp := make([]int64, n+1)
	var dfs1 func(u, p int)
	dfs1 = func(u, p int) {
		dp[u] = 1
		for _, v := range adj[u] {
			if v != p {
				dfs1(v, u)
				dp[u] = (dp[u] * (dp[v] + 1)) % 1000000007
			}
		}
	}
	dfs1(1, 0)

	ans := make([]int64, n+1)
	var dfs2 func(u, p int, upVal int64)
	dfs2 = func(u, p int, upVal int64) {
		var children []int
		for _, v := range adj[u] {
			if v != p {
				children = append(children, v)
			}
		}

		m := len(children)
		pref := make([]int64, m)
		suff := make([]int64, m)

		for i := 0; i < m; i++ {
			v := children[i]
			val := (dp[v] + 1) % 1000000007
			if i == 0 {
				pref[i] = val
			} else {
				pref[i] = (pref[i-1] * val) % 1000000007
			}
		}

		for i := m - 1; i >= 0; i-- {
			v := children[i]
			val := (dp[v] + 1) % 1000000007
			if i == m-1 {
				suff[i] = val
			} else {
				suff[i] = (suff[i+1] * val) % 1000000007
			}
		}

		ans[u] = (upVal + 1) % 1000000007
		if m > 0 {
			ans[u] = (ans[u] * pref[m-1]) % 1000000007
		}

		for i := 0; i < m; i++ {
			v := children[i]
			val := (upVal + 1) % 1000000007
			if i > 0 {
				val = (val * pref[i-1]) % 1000000007
			}
			if i < m - 1 {
				val = (val * suff[i+1]) % 1000000007
			}
			dfs2(v, u, val)
		}
	}
	dfs2(1, 0, 0)

	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Fprint(writer, " ")
		}
		fmt.Fprint(writer, ans[i])
	}
	fmt.Fprintln(writer)
}