题意
有n个节点二叉树,每个节点有0\2个儿子,给定最大深度k,求方案数%9901
n<=500
题解
$dp$定义很
$f[i][j]$表示i个节点组成至多j层方案数
考虑答案
$f[n][k]$表示包含$1-k$所有层数方案数
$f[n][k-1]$表示包含$1-(k-1)$所有层数方案数
于是$f[n][k]-f[n][k-1]$就是答案
转移就是枚举除了根节点分给两个子树多少个
代码
#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 9901 ll f[520][520]; ll n,k; int main(){ scanf("%lld%lld",&n,&k); for(ll i=1;i<=k;i++) f[1][i]=1; for(ll i=1;i<=k;i++) for(ll j=3;j<=n;j+=2) for(ll q=1;q<j;q+=2) (f[j][i]+=(f[j-q-1][i-1]*f[q][i-1])%mod)%=mod; printf("%lld\n",(f[n][k]-f[n][k-1]+mod)%mod); }View Code