#include <bits/stdc++.h>
using namespace std;
#define int long long
const int NM = 5000, MOD = 1e9+7;
int n, p[NM+5], a[NM+5];
vector <int> son[NM+5];
int fac[NM+5], inv_fac[NM+5], inv[NM+5];
int sz[NM+5], dp[NM+5];
int f[NM+5][NM+5];
int binpow(int x, int k){
int res = 1;
while (k > 0){
if (k&1) res = res*x%MOD;
k >>= 1;
x = x*x%MOD;
}
return res;
}
void dfs(int u){
sz[u] = 1;
for (int v : son[u]){
dfs(v);
sz[u] += sz[v];
}
dp[u] = 1;
for (int v : son[u]){
dp[u] = dp[u]*dp[v]%MOD;
}
dp[u] = dp[u]*fac[sz[u]-1]%MOD;
for (int v : son[u]){
dp[u] = dp[u]*inv_fac[sz[v]]%MOD;
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 2; i <= n; i++){
cin >> p[i];
son[p[i]].push_back(i);
}
for (int i = 1; i <= n; i++)
cin >> a[i];
fac[0] = 1;
for (int i = 1; i <= n; i++)
fac[i] = fac[i-1]*i%MOD;
inv_fac[n] = binpow(fac[n], MOD-2);
for (int i = n-1; i >= 0; i--)
inv_fac[i] = inv_fac[i+1]*(i+1)%MOD;
for (int i = 1; i <= n; i++){
inv[i] = inv_fac[i]*fac[i-1]%MOD;
}
dfs(1);
f[1][1] = dp[1];
for (int i = 1; i < n; i++)
for (int u = 1; u <= n; u++){
if (f[u][i] == 0) continue;
int cur = n-i;
for (int v : son[u]){
f[v][i+1] = (f[v][i+1]+f[u][i]*sz[v]%MOD*inv[n-i])%MOD;
cur -= sz[v];
}
f[u][i+1] = (f[u][i+1]+f[u][i]*cur%MOD*inv[n-i])%MOD;
}
for (int u = 1; u <= n; u++){
int res = 0;
for (int i = 1; i <= n; i++)
res = (res+f[u][i]*a[i])%MOD;
cout << res << ' ';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBsb25nIGxvbmcKCmNvbnN0IGludCBOTSA9IDUwMDAsIE1PRCA9IDFlOSs3OwoKaW50IG4sIHBbTk0rNV0sIGFbTk0rNV07CnZlY3RvciA8aW50PiBzb25bTk0rNV07CmludCBmYWNbTk0rNV0sIGludl9mYWNbTk0rNV0sIGludltOTSs1XTsKaW50IHN6W05NKzVdLCBkcFtOTSs1XTsKaW50IGZbTk0rNV1bTk0rNV07CgppbnQgYmlucG93KGludCB4LCBpbnQgayl7CglpbnQgcmVzID0gMTsKCXdoaWxlIChrID4gMCl7CgkJaWYgKGsmMSkgcmVzID0gcmVzKnglTU9EOwoJCWsgPj49IDE7CgkJeCA9IHgqeCVNT0Q7Cgl9CglyZXR1cm4gcmVzOwp9Cgp2b2lkIGRmcyhpbnQgdSl7Cglzelt1XSA9IDE7Cglmb3IgKGludCB2IDogc29uW3VdKXsKCQlkZnModik7CgkJc3pbdV0gKz0gc3pbdl07Cgl9CglkcFt1XSA9IDE7Cglmb3IgKGludCB2IDogc29uW3VdKXsKCQlkcFt1XSA9IGRwW3VdKmRwW3ZdJU1PRDsKCX0KCWRwW3VdID0gZHBbdV0qZmFjW3N6W3VdLTFdJU1PRDsKCWZvciAoaW50IHYgOiBzb25bdV0pewoJCWRwW3VdID0gZHBbdV0qaW52X2ZhY1tzelt2XV0lTU9EOwoJfQp9CgpzaWduZWQgbWFpbigpewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKCWNpbi50aWUoMCk7Cgljb3V0LnRpZSgwKTsKCQoJY2luID4+IG47Cglmb3IgKGludCBpID0gMjsgaSA8PSBuOyBpKyspewoJCWNpbiA+PiBwW2ldOwoJCXNvbltwW2ldXS5wdXNoX2JhY2soaSk7Cgl9Cglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCgkJY2luID4+IGFbaV07CgkKCWZhY1swXSA9IDE7Cglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCgkJZmFjW2ldID0gZmFjW2ktMV0qaSVNT0Q7CglpbnZfZmFjW25dID0gYmlucG93KGZhY1tuXSwgTU9ELTIpOwoJZm9yIChpbnQgaSA9IG4tMTsgaSA+PSAwOyBpLS0pCgkJaW52X2ZhY1tpXSA9IGludl9mYWNbaSsxXSooaSsxKSVNT0Q7CgkJCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewoJCWludltpXSA9IGludl9mYWNbaV0qZmFjW2ktMV0lTU9EOwoJfQoJCglkZnMoMSk7CglmWzFdWzFdID0gZHBbMV07Cglmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykKCQlmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspewoJCQlpZiAoZlt1XVtpXSA9PSAwKSBjb250aW51ZTsKCQkJaW50IGN1ciA9IG4taTsKCQkJZm9yIChpbnQgdiA6IHNvblt1XSl7CgkJCQlmW3ZdW2krMV0gPSAoZlt2XVtpKzFdK2ZbdV1baV0qc3pbdl0lTU9EKmludltuLWldKSVNT0Q7CgkJCQljdXIgLT0gc3pbdl07CgkJCX0KCQkJZlt1XVtpKzFdID0gKGZbdV1baSsxXStmW3VdW2ldKmN1ciVNT0QqaW52W24taV0pJU1PRDsKCQl9Cglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspewoJCWludCByZXMgPSAwOwoJCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKCQkJcmVzID0gKHJlcytmW3VdW2ldKmFbaV0pJU1PRDsKCQljb3V0IDw8IHJlcyA8PCAnICc7Cgl9CglyZXR1cm4gMDsKfQo=