题目叙述
给定一个数组 (c) 和一个数 (s) ,求满足以下条件的二叉树数量:
- 每个节点有个权值,权值为 (c) 中的一个数
- 所有节点权值和为 (s)
题解
首先设 (f_i) 表示 (i) 个结点组成的这样的树有 (f_i) 个,(g_i) 表示数 (i) 是否在。那么 (f_i=sum_{j=0}^i g_jsum_{k=0}^{i-j}f_kcdot f_{i-j-k}) 。其实也就是 (f_i=sum_{i+j+k=i}g_icdot f_{j}cdot f_k) 。如果 (F) 是 (f) 的生成函数,(G) 是 (g) 的生成函数,那么有 (F^2cdot G+1=F) 。注意,这里 (+1) 是因为边界。具体来说,(F^2cdot G) 的零次项很明显是 0. 但是 (f_0 = 1) 。所以这非常不正确。所以要 (+1) 。
那么剩下的任务就是解方程了。(F^2cdot G+1=F),这是个二次方程,但是由于 (G) 是一个不可求逆的东西,所以并不能直接套用求根公式。考虑这样做:
[egin{aligned}&F^2cdot G-F+1=0\Rightarrow &(Fcdot G)^2-(Fcdot G)+G=0\Rightarrow &Fcdot G=frac{1pm sqrt{1-4G}}{2}end{aligned}
]
很明显,左式没有常数项。若右式取正,那么右式必然有常数项。所以右式取负。
也就是:
[egin{aligned}&Fcdot G=frac{1-sqrt{1-4G}}{2}\Rightarrow &Fcdot G=frac{2G}{1+sqrt{1-4G}}\Rightarrow &Gcdot (F-frac{2}{1+sqrt{1-4G}})=0\Rightarrow &F=frac{2}{1+sqrt{1-4G}}end{aligned}
]
所以直接做即可。