lighthouse solution
Sol1
·
2023-02-24 20:26:55
·
题解
定义一次操作 (u,j) 为在 u 的点权为 j 时给 u 的点权 +1。现在可以分别考虑计算每一个操作的贡献。
那么可以枚举操作 (u,j) ,然后对于一个点 v ,其能够对 (u,j) 的贡献产生贡献当且仅当树以 u 为根,执行该操作时 u\rightarrow v 的路径上所有点权均为 j 。那么枚举这一操作何时执行,然后 v 到根这条链上的所有点必须在这一操作之前占据 j 个位置,剩下的位置从剩余的点里面瞎选操作就可以了。该操作执行后从所有点里面瞎选点操作就可以了。得到下式:
\text{Ans}=\sum_{u=1}^n\sum_{v=1}^n\sum_{j=0}^{m-1}\sum_{i=0}^{m-1}\dfrac{(dj)!}{(j!)^d}\cdot\dbinom{i}{dj}(n-d)^{i-dj}n^{m-i-1}
其中 d 是 u\rightarrow v 路径上点的数量。
提一提公因式:
\text{Ans}=n^{m-1}\sum_{u=1}^n\sum_{v=1}^n\sum_{j=0}^{m-1}\dfrac{(dj)!}{(j!)^d(n-d)^{dj}}\sum_{i=0}^{m-1}\cdot\dbinom{i}{dj}\left(\dfrac{n-d}{n}\right)^i
考虑提前对于所有 d ,预处理出路径上点数为 d 的点对数,记为 C_d 。
\text{Ans}=n^{m-1}\sum_{d=1}^nC_d\sum_{j=0}^{m-1}\dfrac{(dj)!}{(j!)^d(n-d)^{dj}}\sum_{i=0}^{m-1}\cdot\dbinom{i}{dj}\left(\dfrac{n-d}{n}\right)^i
然后需要快速计算:
f_{a,b}=\sum_{i=0}^{m-1}\dbinom{i}{a}\left(\dfrac{n-b}{n}\right)^i
套路组合数加法递推:
f_{a,b}=\sum_{i=0}^{m-1}\dbinom{i-1}{a-1}\left(\dfrac{n-b}{n}\right)^i+\sum_{i=0}^{m-1}\dbinom{i-1}{a}\left(\dfrac{n-b}{n}\right)^i
f_{a,b}=\sum_{i=0}^{m-2}\dbinom{i}{a-1}\left(\dfrac{n-b}{n}\right)^{i+1}+\sum_{i=0}^{m-2}\dbinom{i}{a}\left(\dfrac{n-b}{n}\right)^{i+1}
f_{a,b}=\dfrac{n-b}{n}\left[f_{a-1,b}-\dbinom{m-1}{a-1}\left(\dfrac{n-b}{n}\right)^{m-1}\right]+\dfrac{n-b}{n}\left[f_{a,b}-\dbinom{m-1}{a}\left(\dfrac{n-b}{n}\right)^{m-1}\right]
\dfrac{b}{n}f_{a,b}=\dfrac{n-b}{n}f_{a-1,b}-\dbinom{m-1}{a-1}\left(\dfrac{n-b}{n}\right)^{m}-\dbinom{m-1}{a}\left(\dfrac{n-b}{n}\right)^{m}
f_{a,b}=\dfrac{n-b}{b}f_{a-1,b}-\dfrac{n}{b}\dbinom{m-1}{a-1}\left(\dfrac{n-b}{n}\right)^{m}-\dfrac{n}{b}\dbinom{m-1}{a}\left(\dfrac{n-b}{n}\right)^{m}
f_{a,b}=\dfrac{n-b}{b}f_{a-1,b}-\dfrac{n}{b}\dbinom{m}{a}\left(\dfrac{n-b}{n}\right)^{m}
这样这个东西就可以递推了。既然 b 只有 O(n) 种,我们就可以在枚举到一个 d 的时候递推一遍,然后剩下的暴力算可以做到 O(nm+m\ln m) ,足以通过。
可以通过点分治和分块多点求值做到 O(n\log^2n+m\log^3m+m\sqrt m\log m) ,然而由于常数原因没啥用。