1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include<bits/stdc++.h> using namespace std; const int maxn=100; int n,mod; int a[maxn+5]; vector<int> E[maxn+5]; int sz[maxn+5]; int dp[maxn+5][maxn+5][maxn+5]; int f[2][maxn+5][maxn+5][maxn+5]; int g[2][maxn+5][maxn+5][maxn+5]; int h[2][maxn+5][maxn+5][maxn+5]; inline void Add(int &x,int y){ if(x+y>=mod) x=x+y-mod; else x=x+y; } void Dfs(int u,int fa){ for(int v:E[u]) if(v!=fa) Dfs(v,u); f[0][u][0][0]=g[0][u][0][0]=1; for(int v:E[u]){ if(v==fa) continue; for(int i=0;i<=sz[u];i++){ for(int j=0;i+j<=sz[u];j++){ for(int ii=0;ii<=sz[v];ii++){ for(int jj=0;ii+jj<=sz[v];jj++){ const int val=dp[v][ii][jj]; const int fval=f[0][u][i][j]; const int gval=g[0][u][i][j]; const int hval=h[0][u][i][j]; Add(f[1][u][i+ii][j+jj],1ll*fval*val%mod); if(i+ii) Add(g[1][u][i+ii-1][j+jj],1ll*gval*val%mod*ii%mod); Add(g[1][u][i+ii][j+jj],1ll*gval*val%mod); if(j+jj) Add(h[1][u][i+ii][j+jj-1],1ll*gval*val%mod*jj%mod); Add(h[1][u][i+ii][j+jj],1ll*hval*val%mod); if(i+ii) Add(h[1][u][i+ii-1][j+jj],1ll*hval*val%mod*ii%mod); } } } } sz[u]+=sz[v]; swap(f[0][u],f[1][u]); memset(f[1][u],0,sizeof(f[1][u])); swap(g[0][u],g[1][u]); memset(g[1][u],0,sizeof(g[1][u])); swap(h[0][u],h[1][u]); memset(h[1][u],0,sizeof(h[1][u])); } for(int i=0;i<=sz[u];i++){ for(int j=0;i+j<=sz[u];j++){ Add(dp[u][i+1][j],f[0][u][i][j]); Add(dp[u][i][j+1],1ll*a[u]*f[0][u][i][j]%mod); Add(dp[u][i][j],1ll*a[u]*g[0][u][i][j]%mod); Add(dp[u][i][j],h[0][u][i][j]); } } sz[u]++; } signed main(){ freopen("tree.in","r",stdin); freopen("tree.out","w",stdout); scanf("%d%d",&n,&mod); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int u,v; for(int i=1;i<n;i++){ scanf("%d%d",&u,&v); E[u].emplace_back(v); E[v].emplace_back(u); } Dfs(1,0); printf("%d",dp[1][0][0]); return 0; }
|