远古记忆里的一道模拟赛题,没记错应该是 djq 老师的场/bx/bx/bx
之前经常想起来经常想不起来怎么做,遂记录。
定义
T0 为一个结点的有根树,
Tn 为
Tn−1 的根节点下面再挂一个
Tn−1 作为子树的树,问
Tn 中距离为
d 的点对数,对
109+7 取模。
1≤n≤109 而
1≤d≤107。
设
f(n,d) 为答案,则跨过两个
Tn−1 间连的边的点对数为
i=0∑d−1(in−1)(d−1−in−1),因为显然
Tn 中有
(in) 个深度为
i 的点。Vandermonde 卷积可得为
(d−12n−2),故而
f(n,d)=2f(n−1,d)+(d−12n−2),即答案为
i=0∑n−12n−1−i(d−12i)。
……额这个
(d−12i) 看起来挺难处理的?有没有什么高妙的事情,让复杂度转移到
d 上?
回到上一步 Vandermonde 卷积之前,我们要找两个
{1,2,⋯,i} 的子集大小和为
d′=d−1。
枚举其交的大小。设交的大小为
b,则对称差的大小为
d−1−2b,则有
(d′2i)=b=0∑⌊d′/2⌋2d′−2b(b,d′−2b,i−d′+bi)=b=0∑⌊d′/2⌋2d′−2b(bd′−b)(d′−bi)
我们利用枚举一个
O(d) 的变量的代价使得上指标的
2i 变成了
i!回到原式,答案为
b=0∑⌊d′/2⌋2d′−2b(bd′−b)i=0∑n−12n−1−i(d′−bi)
此时关于
i 的和式便明朗了起来:
i 个里选
d−b 个,
n−1−i 个里面随便选,那么在中间插入一个元素的话,其实就是问
n 个元素选至少
d′−b+1=d−b 个的方案数——对于每个
d−b≤d,这都可以递推求出:用总共的
2n 再递推地逐一减去少于
d−b 个的组合数即可。
本问题解决,时间复杂度
O(d)。