//Hello. I‘m Peter.
#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<cctype>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
#define peter cout<<"i am peter"<<endl
#define input freopen("data.txt","r",stdin)
#define randin srand((unsigned int)time(NULL))
#define INT (0x3f3f3f3f)*2
#define LL (0x3f3f3f3f3f3f3f3f)*2
#define MAXN
#define N 200100
#define M
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
const int mod=1e9+7;
int n;
struct Edge{
int from,to,next;
}edge[N<<1];
int head[N],num_edge;
inline void add_Edge(int from,int to){
int t=++num_edge;
edge[t].from=from;
edge[t].to=to;
edge[t].next=head[from];
head[from]=t;
}
ll dp[N],pre[N],suf[N],ans[N];
inline void dfs(int now,int comfrom){
dp[now]=1;
for(int i=head[now];i!=-1;i=edge[i].next){
int to=edge[i].to;
if(to==comfrom) continue;
dfs(to,now);
dp[now]=dp[now]*(dp[to]+1)%mod;
}
}
int fa[N];
inline void bfs(){
queue<int>q;
q.push(1);
fa[1]=0;
ans[1]=dp[1];
dp[1]=0;
vector<int>son;
while(!q.empty()){
int now=q.front();
q.pop();
son.clear();
for(int i=head[now];i!=-1;i=edge[i].next){
int to=edge[i].to;
if(fa[now]==to) continue;
fa[to]=now;
son.push_back(to);
}
int len=(int)son.size();
ll nowv=1;
for(int i=0;i<len;i++){
pre[i]=nowv;
nowv=nowv*(dp[son[i]]+1)%mod;
}
nowv=1;
for(int i=len-1;i>=0;i--){
suf[i]=nowv;
nowv=nowv*(dp[son[i]]+1)%mod;
}
int t=0;
for(int i=head[now];i!=-1;i=edge[i].next){
int to=edge[i].to;
if(fa[now]==to) continue;
ll nowv=pre[t]*suf[t]%mod;
nowv=nowv*(dp[now]+1)%mod;
ans[to]=dp[to]*(nowv+1)%mod;
q.push(to);
t++;
dp[to]=nowv;
}
}
}
int main(){
n=read();
num_edge=0;
for(int i=1;i<=n;i++){
head[i]=-1;
}
for(int i=2;i<=n;i++){
int p=read();
add_Edge(p,i);
add_Edge(i,p);
}
dfs(1,0);
bfs();
for(int i=1;i<=n;i++){
if(i!=1) printf(" ");
printf("%d",(int)ans[i]);
}
printf("\n");
return 0;
}
Codeforces Round #302 (Div. 1 D)
原文地址:http://blog.csdn.net/uestc_peterpan/article/details/45606475