提交时间:2026-04-24 19:46:09
运行 ID: 41472
#include<bits/stdc++.h> using namespace std; const int N=510; const int mod=998244353; int f[N][N],a[N],tmp[N],n; vector<int> E[N]; int pre[N],suf[N],tmp2[N]; int pos[N],neg[N]; int mul[N*2],inv[N*2],ivp[N*2]; int c0[N*2],c1[N*2],c2[N*2]; int qp(int a,int b){ int x=1; for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) x=1ll*x*a%mod; return x; } void dfs(int u,int pa){ int cnt=0;f[u][0]=1; for(auto v:E[u]){ if(v==pa) continue; dfs(v,u);cnt++; memset(tmp,0,sizeof(tmp)); for(int i=0;i<=n;i++){ for(int j=0;i+j<=n;j++){ tmp[i+j]=(tmp[i+j]+1ll*f[u][i]*f[v][j])%mod; } }for(int i=0;i<=n;i++) f[u][i]=tmp[i]; } for(int i=1;i<=n;i++) f[u][i]=(f[u][i]+f[u][i-1])%mod; //pre[0]=1;suf[n]=1; //for(int i=1;i<=n;i++) pre[i]=1ll*pre[i-1]*(0+mod-(i-1))%mod; //for(int i=n-1;i>=0;i--) suf[i]=1ll*suf[i+1]*(0+mod-(i+1))%mod; mul[0]=1;ivp[0]=1;inv[0]=1; for(int i=1;i<=n*2+1;i++){ mul[i]=(a[u]+mod+n+1-i)%mod;c0[i]=0; if(!mul[i]) c0[i]=1,mul[i]=1; ivp[i]=qp(mul[i],mod-2),c2[i]=c0[i]; mul[i]=1ll*mul[i-1]*mul[i]%mod;c0[i]+=c0[i-1]; inv[i]=qp(mul[i],mod-2);c1[i]=c0[i]; } auto qu=[&](int l,int m,int r){ int c=c0[r]-c1[l-1]-c2[m]; if(c) return 0ll;else return 1ll*mul[r]*inv[l-1]%mod*ivp[m]%mod; }; auto lag=[&](int x){ long long res=0; for(int i=0;i<=n;i++){ //a[u]+x - [0,i),(i,n] //n+1 - (n+1-x) res=(res+1ll*qu(n+1-x,n+i+1-x,n+n+1-x)*f[u][i])%mod; }return res; }; for(int i=0;i<=n;i++) f[u][i]=1ll*f[u][i]*tmp2[i]%mod; for(int i=0;i<=n;i++) tmp[i]=lag(i); for(int i=0;i<=n;i++) f[u][i]=tmp[i]; //cout<<u<<endl; //for(int i=0;i<=n;i++) cout<<f[u][i]<<' ';cout<<endl; } int main(){ //freopen("counting.in","r",stdin); //freopen("counting.out","w",stdout); cin>>n; for(int i=2;i<=n;i++){ int x;cin>>x; E[x].push_back(i); E[i].push_back(x); } pos[0]=1;neg[0]=1; for(int i=1;i<=n;i++) pos[i]=1ll*pos[i-1]*i%mod, neg[i]=1ll*neg[i-1]*(mod-i)%mod; for(int i=1;i<=n;i++) pos[i]=qp(pos[i],mod-2), neg[i]=qp(neg[i],mod-2); for(int i=0;i<=n;i++) tmp2[i]=1ll*pos[i]*neg[n-i]%mod; for(int i=1;i<=n;i++) cin>>a[i]; dfs(1,0);cout<<f[1][0]<<endl; return 0; }