n 个点,随机构成一颗有根树,求叶子的期望数量。
n≤109.
Subtask 1#
对于 20% 的数据,n≤20.
暴力是过不了的,应该有一些 DP 可以通过。
Subtask 2#
设 fi 表示包含 i 个节点的有根树数量,那么根据卡特兰数公式,有 fn=n+11C2nn.
因此当 n=20 时,不同的有根树数量为 f20=6564120420,暴力无法通过 Subtask 1.
设 gi 表示有 i 个节点的所有不同形态二叉树的叶子结点数量和,那么题目所求即为:fngn.
先打表,至少可以打到 n=10.

观察一下,可以发现一个规律:
gn=fn−1⋅n
由 fn=n+11C2nn,题目所求的答案可以用只含有 n 的式子表示出来:
Ans=fngn=fnfn−1⋅n=n+11(n2n)n1(n−12n−2)⋅n=n⋅(n)!(n)!(2n)!(n+1)⋅(n−1)!(n−1)!(2n−2)!⋅n
继续化简得到:
Ans=(n)!(n)!(n−1)!(n−1)!(n+1)⋅(2n)!(2n−2)!=n21(n+1)⋅(2n−1)⋅(2n)1=2⋅(2n−1)n⋅(n+1)
用快速幂求逆元即可,时间复杂度为 O(logp),p 为模数.
下面给出 gn=fn−1⋅n 的证明。
对于每棵 n 个点的二叉树,如果里面有 k 个叶节点,那么我们分别把这 k 个叶子删去,会得到 k 棵 n−1 个点的二叉树。
因此,所有 n 个节点的二叉树中,每个叶子都唯一对应一棵 n−1 个节点的二叉树。
对于每棵 n−1 个点的二叉树,有 n 个位置可以接上一个新的叶子节点。
因此,每棵 n−1 个节点的二叉树都对应 n 个叶子。(所有 n 个节点的二叉树的所有叶子中的 n 个)
综上,结论得证。