Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* codeforces 543D tree dp with prefix and suffix dp */
- ll res[MAX];
- vi v[MAX];vl prefix[MAX],suffix[MAX];ll ans[MAX];
- void dfs(int s,int p){
- for(auto it : v[s]){
- if(it==p)continue;
- dfs(it,s);
- res[s] = res[s] * (res[it] + 1);
- if(res[s]>=mod)res[s]%=mod;
- }
- }
- void dfs2(int s,int p){
- ans[s]= res[s];
- ll pref = 1,suff = 1;
- int len = v[s].size();
- int cnt = 0;
- for(auto it : v[s]){
- prefix[s].pb(pref);
- suffix[s].pb(suff);
- pref = pref * (res[it] + 1);
- pref%=mod;
- suff = suff * (res[v[s][len - cnt - 1]] + 1);
- suff%=mod;
- cnt++;
- }
- reverse(all(suffix[s]));
- for(int i = 0;i<len;i++){
- if(v[s][i]==p)continue;
- ll temp = res[s];
- res[s] = prefix[s][i] * suffix[s][i] ;
- res[s]%=mod;
- res[v[s][i]] = (res[s] + 1) * res[v[s][i]];
- res[v[s][i]]%=mod;
- dfs2(v[s][i],s);
- res[s] = temp;
- }
- }
- int main()
- {
- booster()
- ///read("input.txt");
- int n;
- cin>>n;
- for(int i = 1;i<n;i++){
- int a;
- cin>>a;
- v[a].pb(i+1);
- v[i+1].pb(a);
- }
- for(int i = 1;i<=n;i++)res[i] = 1;
- dfs(1,0);
- dfs2(1,0);
- for(int i = 1;i<=n;i++)cout<<ans[i]<<" ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement