#include #include #include using namespace std; const int MOD = 1000000007; int n; vector> g; vector p; vector pi; vector counts; vector> z; static int mul(int lhs, int rhs) { return (int)(((long)lhs * (long)rhs) % MOD); } int solve(int v, int c) { if (c == 0) { return 1; } if (z[v][c] == -1) { int u = p[v]; if (pi[v] + 1 == g[u].size()) { if (g[v].empty()) { z[v][c] = (c == 1) ? 1 : 0; } else { z[v][c] = solve(g[v][0], c - 1); } } else { int s = g[u][pi[v] + 1]; int total = solve(s, c); for (int left = 1; left <= c; ++left) { int cur = solve(s, c - left); if (g[v].empty()) { if (left != 1) { cur = 0; } } else { cur = mul(cur, solve(g[v][0], left - 1)); } total = (total + cur) % MOD; } z[v][c] = total; } } return z[v][c]; } int main() { cin >> n; g.resize(n, vector(0)); p.resize(n); fill(p.begin(), p.end(), 0); pi.resize(n); fill(pi.begin(), pi.end(), 0); counts.resize(n); fill(counts.begin(), counts.end(), 0); p[0] = -1; pi[0] = 0; counts[0] = 1; for (int v = 1; v < n; ++v) { cin >> p[v]; pi[v] = g[p[v]].size(); g[p[v]].push_back(v); int u = v; while (u != -1) { ++counts[u]; u = p[u]; } } z.resize(n, vector(n + 1)); for (int i = 0; i < n; ++i) { fill(z[i].begin(), z[i].end(), -1); } for (int c = 1; c <= n; ++c) { int total = 0; for (int v = 0; v < n; ++v) { int cur; if (g[v].empty()) { cur = (c == 1) ? 1 : 0; } else { cur = solve(g[v][0], c - 1); } total = (total + cur) % MOD; } cout << total << endl; } return 0; }