提交时间:2024-10-20 16:09:39
运行 ID: 33728
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=10010,N=20,Mod=998244353; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT=1;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int Pow(int x,int y){if(y<0)return 0;int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int n,rt,tot,a[MAXN],dep[MAXN],p[MAXN],vis[MAXN],f[2][MAXN]; void dfs(int u,int lst){ int d=0,x=0,y=0; vis[u]=tot; for(inx(u-n))if(p[v]>tot)d++; x=Pow(2,d),y=Pow(2,d-1)*d%Mod; f[0][u]=1,f[1][u]=0; for(inx(u))if(v!=lst){ dfs(v,u); int f0,f1; f0=f[0][u]*(f[0][v]+f[1][v]*2%Mod)%Mod; f1=f[0][u]*f[1][v]%Mod+f[1][u]*(f[0][v]+f[1][v]*2%Mod)%Mod; f[0][u]=f0,f[1][u]=f1; } int f0,f1; f0=f[0][u]*x%Mod; f1=f[0][u]*y%Mod+f[1][u]*x%Mod; f[0][u]=f0,f[1][u]=f1; } void slv(){ n=read(); for(int i=1;i<n;i++){ int u=read(),v=read(); add_side(u,v); } for(int i=1;i<=n;i++)p[i]=n; for(int i=1;i<n;i++)a[i]=read(),p[a[i]]=i; for(int i=1;i<n;i++){ for(inx(a[i]))if(p[v]<=i)add_side(a[i]+n,v+n); int res=1;tot=i; for(int j=1;j<=n;j++)if(p[j]<=i&&vis[j+n]!=i)dfs(j+n,j+n),res=res*f[1][j+n]%Mod; printf("%lld\n",res); } } signed main(){ slv(); return 0; }