WA求助
查看原帖
WA求助
1115392
small_moon楼主2024/8/13 13:56
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long ll;
ll read();
struct Edge{
	int ed,next;
}eg[N*2];
ll n,p,tot,ans;
ll nbs[N],c[N],v[N],sum[N],vum[N];
void add(ll x,ll y)
{
	tot++; eg[tot].ed=y; eg[tot].next=nbs[x]; nbs[x]=tot;
}
void get_sum(int k,int fa)
{
	sum[k]=1;
	for(int x=nbs[k];x;x=eg[x].next)
	{
		int u=eg[x].ed;
		if(u==fa) continue;
		get_sum(u,k);
		sum[k]=(sum[k]*sum[u])%p;
	}
	sum[k]=(sum[k]*c[k])%p;
}
void get_vum(int k,int fa)
{
	vum[k]=1;
	for(int x=nbs[k];x;x=eg[x].next)
	{
		int u=eg[x].ed;
		if(u==fa) continue;
		get_vum(u,k);
		vum[k]=(vum[k]*vum[u])%p;
	}
	vum[k]=(vum[k]*v[k])%p;
	if(vum[k]==0) vum[k]=1;
}
void dfs(int k,int fa)
{
	for(int x=nbs[k];x;x=eg[x].next)
	{
		int u=eg[x].ed;
		if(u==fa) continue;
		dfs(u,k);
	}
	if(k==1) ans=(ans+sum[1])%p;
	else ans=(ans+(sum[k]*(vum[1]/vum[k])%p))%p;
}
int main()
{
	n=read(); p=read();
	for(int i=1;i<n;i++)
	{
		ll x=read(),y=read();
		add(x,y); add(y,x);
	}
	for(int i=1;i<=n;i++) c[i]=read();
	for(int i=1;i<=n;i++) v[i]=read();
	get_sum(1,0); get_vum(1,0); dfs(1,0);
	cout<<ans;
	return 0;
}
ll read()
{
	ll x=0,f=1; char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
2024/8/13 13:56
加载中...