这个题我在考试的时候把所有的转移都想全了就是新加一个点时有I.不作为II.自己呆着III.连一个IV.连接两个子树中的两个V连接一个子树中的两个,然而V我并不会转移........
这个题的正解体现了一种神奇的思想,对于好合并但是不好转移的dp我们可以先打散然后合并到最后,所以我们从一开始维护f[i][j]表示i阶超级树中有j个互不相交的路径的方案数。
#include <cstdio>
typedef long long LL;
LL f[310][310],mod,temp;
int n;
int main(){
scanf("%d%lld",&n,&mod);
f[1][0]=f[1][1]=1;
for(int i=1;i<n;i++){
for(int k=0;k<=n;k++)f[i][k]%=mod;
for(int l=0;l<=n;l++)
for(int r=0;l+r<=n;r++)
temp=f[i][l]*f[i][r]%mod,
f[i+1][l+r]+=temp*(1+(l+r)*2),
f[i+1][l+r+1]+=temp,
f[i+1][l+r-1]+=temp*(l*r*2+(l*(l-1)+r*(r-1)));
}
printf("%lld",f[n][1]%mod);
}