求助玄学
查看原帖
求助玄学
1121412
Cute_Fish楼主2024/5/26 10:51

rt,第二个样例每次测的时候后四个数都不一样且都是很大的数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N=1e6+7;
const int mod=1e9+7;
int n,head[N],tot=0;
int dp[N],ans[N];
vector<ll>sum[N],suf[N];
struct edge{int to,next;}e[N<<1];
inline void add(int from,int to){
	e[++tot]={to,head[from]};
	head[from]=tot;
}
inline void dfs1(int u,int fa){
	dp[u]=1;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v!=fa)dfs1(v,u),dp[u]=dp[u]*((dp[v]+1ll)%mod)%mod;
	}
	return;
}
inline void dfs2(int u,int fa){
	ans[u]=1;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		ans[u]=ans[u]*((dp[v]+1ll)%mod)%mod;
		if(v!=fa)sum[u].push_back(dp[v]+1),suf[u].push_back(dp[v]+1);
	}
	for(int i=1;i<sum[u].size();i++)sum[u][i]=(sum[u][i]%mod*sum[u][i-1]%mod)%mod;
	for(int i=suf[u].size()-2;i>=0;i--)suf[u][i]=(suf[u][i]%mod*suf[u][i+1]%mod)%mod;
	int cnt=0;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==fa)continue;
		dp[u]=(fa?dp[fa]+1:1)%mod;
		if(cnt>0)dp[u]=dp[u]%mod*sum[u][cnt-1]%mod;
		if(cnt<=suf[u].size()-2)dp[u]=dp[u]%mod*suf[u][cnt+1]%mod;
		dfs2(v,u);cnt++;
	}
}
signed main(){
	cin>>n;
	for(int i=2,x;i<=n;i++)cin>>x,add(x,i),add(i,x);
	dfs1(1,0);dfs2(1,0);
	for(int i=1;i<=n;i++)cout<<(ans[i]%mod+mod)%mod<<" ";
}
2024/5/26 10:51
加载中...