提交时间:2024-10-20 14:47:01

运行 ID: 33716

#include<iostream> #include<cstring> #include<ctime> #define timeMS (clock()*1000/CLOCKS_PER_SEC) using namespace std; #define int long long const int N=5010,P=998244353; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } inline int fpow(int a,int b=P-2){ int c=1; for(;b;b>>=1,a=a*a%P)if(b&1)c=c*a%P; return c; } int n,head[N],to[N<<1],nex[N<<1],a[N]; void init(){ cin>>n; for(int i=1;i<n;i++){ int u=read(),v=read(); to[i<<1]=v; nex[i<<1]=head[u]; head[u]=i<<1; to[i<<1|1]=u; nex[i<<1|1]=head[v]; head[v]=i<<1|1; } for(int i=1;i<n;i++)a[i]=read(); } bool vis[N]; int bel[N]; int son[N],bro[N],f[N][2],pre[N],suf[N]; int stk[N],top; void dfs(int nd,int fro){ bel[nd]=fro; for(int i=head[nd];i;i=nex[i])if(!bel[to[i]]){ stk[++top]=to[i]; bro[to[i]]=son[nd],son[nd]=to[i]; if(vis[to[i]])dfs(to[i],fro); } } inline void clear(){ while(top)son[stk[top]]=bro[stk[top]]=f[stk[top]][0]=f[stk[top]][1]=pre[stk[top]]=suf[stk[top]]=0,top--; } int temp[N],cnt; void dp(int nd){ if(!vis[nd])f[nd][1]=1; else f[nd][0]=1; for(int i=son[nd];i;i=bro[i])dp(i); for(int i=son[nd];i;i=bro[i])pre[i]=f[nd][0],f[nd][0]=f[nd][0]*(f[i][0]+2*f[i][1])%P,temp[++cnt]=i; suf[0]=1; while(cnt){ int i=temp[cnt--]; suf[i]=(f[i][0]+2*f[i][1])*suf[bro[i]]%P; } for(int i=son[nd];i;i=bro[i])f[nd][1]=(f[nd][1]+f[i][1]*pre[i]*suf[bro[i]])%P; } inline int calc(int rt){ dp(rt); int ans=f[rt][1]; clear(); return ans; } signed main(){ // freopen("tree.in","r",stdin); // freopen("tree.out","w",stdout); init(); for(int i=1;i<n;i++){ // cerr<<i<<endl; int ans=1; int x=a[i]; vis[x]=true; memset(bel,0,sizeof(bel)); for(int j=1;j<=n;j++)if(vis[j]&&!bel[j]){ stk[++top]=j; dfs(j,j); // for(int t=1;t<=top;t++)cout<<stk[t]<<' '<<son[stk[t]]<<" ";cout<<endl; ans=ans*calc(j)%P; } // cout<<endl; printf("%lld\n",ans); } // cerr<<timeMS; return 0; } //test