RT,用类似随机树这题的方法转移,每次合并左子树和右子树。具体来说考虑 dpi,j 表示点数为 i,至少为 j 层的二叉树构成完满二叉树的形态数量,转移时容斥:
dpi,j←dpp,j×dpi−1−p,1+dpp,1×dpi−1−p,j−dpp,j×dpi−1−p,j
下面是我的实现:
cin>>n>>k;
dp[1][1]=1,dp[3][1]=dp[3][2]=1;
fr1(i,4,n){
fr1(j,2,k+1){
fr1(p,1,i-2){
dp[i][j]+=(dp[p][j-1]*dp[i-1-p][1]%M+dp[p][1]*dp[i-1-p][j-1]%M-dp[p][j-1]*dp[i-1-p][j-1]%M+M)%M;
dp[i][j]%=M;
}
}
}
cout<<(dp[n][k]-dp[n][k+1]+M)%M<<endl;
然而只有 49 分。希望可以得到指出错误或者较小的 hack(下载数据是 199 77 /kk)。