1. #include <cstdio>
    2. #include <vector>
    3. #include <algorithm>
    4. #include <cassert>
    5. #include <cstdlib>
    6. #include <cstring>
    7. #include <iostream>
    8. #define int long long
    9. using namespace std;
    10. inline int gi(){
    11. char tmp=getchar();int ans=0;
    12. while(!isdigit(tmp)) tmp=getchar();
    13. while(isdigit(tmp)){
    14. ans = ans * 10 + tmp - '0';
    15. tmp = getchar();
    16. }
    17. return ans;
    18. }
    19. const int N = 1e6;
    20. const int Mod = 1e9 + 7 ;
    21. struct Edg{
    22. int v,nxt;
    23. }Edge[N<<1];int Head[N],cnt;
    24. inline void Add(int u,int v){
    25. Edge[++cnt].v=v;Edge[cnt].nxt=Head[u];Head[u]=cnt;
    26. }
    27. int F[N],G[N];
    28. vector<int> V[N],Pre[N],Suf[N];
    29. void Dfs1(int pos,int fa){
    30. F[pos]=1;
    31. for(int i = Head[pos];i;i=Edge[i].nxt){
    32. int arr = Edge[i].v;
    33. if(arr == fa) continue;
    34. Dfs1(arr,pos);
    35. Pre[pos].push_back(F[arr]+1);
    36. Suf[pos].push_back(F[arr]+1);
    37. V[pos].push_back(arr);
    38. F[pos] *= (F[arr] + 1);
    39. F[pos] %= Mod;
    40. }
    41. if(V[pos].size() == 0) return ;
    42. for(int i=0;i<V[pos].size();++i){
    43. int arr = V[pos][i];
    44. Pre[pos][i] = F[arr] + 1;
    45. if(i!=0)
    46. Pre[pos][i] = Pre[pos][i-1] * Pre[pos][i] % Mod;
    47. }
    48. for(int i=V[pos].size()-1;~i;--i){
    49. int arr = V[pos][i];
    50. Suf[pos][i] = F[arr] + 1;
    51. if(i != V[pos].size()-1)
    52. Suf[pos][i] = Suf[pos][i+1] * Suf[pos][i] % Mod;
    53. }
    54. }
    55. void Dfs2(int pos,int fa){
    56. if(V[pos].size() == 0) return ;
    57. for(int i = 0;i < V[pos].size();++i){
    58. int arr = V[pos][i];
    59. int q,p;
    60. if(i==0) p = 1;
    61. else p = Pre[pos][i-1];
    62. if(i == V[pos].size()-1) q = 1;
    63. else q = Suf[pos][i+1];
    64. G[arr] = (G[pos] * q%Mod * p%Mod +1) %Mod;
    65. Dfs2(arr,pos);
    66. }
    67. }
    68. signed main()
    69. {
    70. #ifdef TSUKIAKIOI
    71. freopen("data.in","r",stdin);
    72. #endif
    73. int n=gi();
    74. for(int i=2;i<=n;++i){
    75. int v = gi();
    76. Add(v,i);Add(i,v);
    77. }
    78. Dfs1(1,0);
    79. G[1]=1;
    80. Dfs2(1,0);
    81. for(int i=1;i<=n;++i)
    82. printf("%lld ",F[i]*G[i]%Mod);
    83. return 0;
    84. }