测试.
$heap$
- 有多少个节点数目为 $n$ ,权值为 $1\sim n$ 且互不相同的二叉堆?答案对 $10^9+7$ 取模.
- $n\leq 10^9$ .
- $O(n)$ 的做法十分简单, 先搞出每个节点的 $siz$ ,记 $f(i)$ 表示子树 $i$ 内用 $siz_i$ 个权值能形成的合法二叉堆数目.
- 转移显然有 $f(i)={siz_i\choose siz_{2i}}\cdot f(2i)\cdot f(2i+1)$ ,叶子节点 $f(i)=1$ .
- 把组合数拆开,算算贡献,可以发现 $f(1)=\frac {n!} {\prod siz_i}$ .考虑 $siz$ 连乘积怎么算.
- 注意到一个点的左右子树至少有一个是满的二叉树(每一层填满),那么就可以先求出每种满二叉树的答案,此时递归入另一个子树继续计算就可以了.这部分的时间复杂度为 $O(logn)$ .
- 还有一个 $n!$ 需要计算.分块打下表,就能很快求出啦.
1 |
|
这里用了另一种等价的做法,意义不是很明显?略去了表的数据.
$secret$
- 待更.
$tree$
- 待更.