给定一棵 个节点的树,对于每个节点,计算出:。其中 表示第 个节点到第 个节点路径上的边数, 为一个常数且为正整数。
Constraints
,
Solution
用结论来化简式子:
为第二类斯特林数,
可得:
根据组合数递推公式: 就可以很方便的对后面的部分进行树形 dp 了。
具体地,令 为不在 的子树中的部分的贡献,令 为 的子树的贡献。特别的,。
详见代码。
Code
1 |
|
Living is do or die.
给定一棵 n 个节点的树,对于每个节点,计算出:S(i)=∑j=1ndist(i,j)k(mod10007)。其中 dist(i,j) 表示第 i 个节点到第 j 个节点路径上的边数,k 为一个常数且为正整数。
n≤50000 ,k≤150
用结论来化简式子:xn=∑i=1nS(n,i)⋅F(x,i)
S(n,i)为第二类斯特林数,F(x,i)=(x−i)!x!
可得:
ans(i)=j=1∑ndist(i,j)m=j=1∑nk=1∑mS(m,k)⋅F(dist(i,j),k)=k=1∑mS(m,k)j=1∑nF(dist(i,j),k)=k=1∑mS(m,k)⋅k!⋅j=1∑nC(dist(i,j),k)
根据组合数递推公式:C(n,m)=C(n−1,m)+C(n−1,m−1) 就可以很方便的对后面的部分进行树形 dp 了。
具体地,令 up(x,i) 为不在 x 的子树中的部分的贡献,令 dn(x,i) 为 x 的子树的贡献。特别的,dn(x,0)=1。
详见代码。
1 | #include<cstdio> |