《从数树开始的数数生活》
求 T1∑T2∑yn−∣T1∩T2∣ T1,T2 是两个树的边集, $OP $ 为 0,1,2 分别是给出两棵树,给出一颗树和不给出树
upd : 可能有 y,y−1 混用的问题,结合上下文大概能知道啥意思
OP = 0
开个 set 即可
OP = 1
我们先钦定选取了集合 E 作为交集
”答案“为 E∑yn−∣E∣F(E) F(E) 为交集为 E 的方案数,当然这个 E 是至少的交集,还需要容斥
考虑如果我们选取了某些边,那么原树一定会被分割成几个连通块,我们需要求出这几个连通块连成一个树的方案数
假设分割成了 m 个连通块,可知答案为nm−2∏sizi
把连通块看成一个点,从 purfer 序列的角度考虑,一个出现了 di 次的点在原图中度数为 di+1
那么连通块之间可以连边,贡献就是 sizidi+1
那么枚举 purfer 序列,就是 ∑di=m−2∑i=1∏mdi!m!∏sizidi+1
=m!∑di=m−2∑i=1∏mdi!sizidi+1
=m!∏_i=1msizidi∑_∑di=m−2∏di!siz_idi
考虑 ∑di=m−2∑ 这个条件,如果我们给后面的 ∏ 加一个占位的 xi 那么就是提取了 m−2 项的系数
那么设 Gk(x)=∑i!sizkixi=esizkx
那么 ∏Gk(x)=exp{∑sizi}=en
那么原式为 m!∏sizi[xm−2]en=nm−2∏sizi
答案为 ∑_Eyn−∣E∣F(E)=∑_Eyn−∣E∣nn−∣E∣−2∏sizi=ynnn−2∑_E(yn)−∣E∣∏sizi
枚举边集和容斥都是指数级的,先解决枚举的问题
考虑比较麻烦的 $ \prod \mathrm{siz}_i $ ,可以组合意义理解为每个连通块选一个点的方案数,那么设 dpx,0/1 表示以 x 为根的子树连通块,是否已经选点的方案数乘上贡献
那么枚举当前边在不在 E 中然后 dp 即可做到线性
具体的有
当边 (x,v) 在 E 中时,有
dpx,0←dpx,0×dpv,0×(yn)−1
dpx,1←(dpx,1×dpv,0+dpx,0×dpv,1)×(yn)−1
否则,有
dpx,0←dpx,0×dpv,1
dpx,1←dpx,1×dpv,1
dp1,1 即所求
然后是容斥的解决,考虑我们枚举的集合最终的真重合的边集 S ,那么实际上它会被算 (∣E∣∣S∣) 次,那么因为我们枚举了所有的子集,所以他被算的答案就是 i=0∑∣S∣(i∣S∣)yi=(y+1)∣S∣ 所以只要令 y→y−1 就可以得到正确的贡献
OP = 2
继续考虑一棵树的做法,设 F(E)=nn−∣E∣−2∏sizi 即方案数
因为两个树都没有,所以只要枚举交集就可以生成出两个树 即 E∑yn−∣E∣f(E)2 同样是指数级的
当然也可以用 OP = 1 的做法把 y 改写成 y−1 来避免容斥,以下为了方便都写得 y
考虑枚举 E 的大小,设 gi=∣E∣=i∑f(E)2 答案即为 i∑yn−igi
这样只要可以在合理的时间里算出来 {gi} 即可
因为siz太难打了 枚举每个连通块大小 ai
显然 gm 有 n−m 个连通块
先得让每个连通块连通,即连通块内部形成树 i=1∏n−maiai−2
然后将每个点划分进连通块,一个多重集排列 i=1∏n−mai!n!
然后我们枚举时赋予了顺序,但实际上连通块无序,所以除掉 (n−m)!
然后乘上 f(E)2
以下的 y 均为 y−1 因为 y→y−1 的方法是在 y−1 下才有正确贡献
gm=∑ai=n∑(n−m)!n!i=1∏n−mai!aiai−2(nn−m−2i=1∏n−mai)2
m∑ym∑ai=n∑(n−m)!n!i=1∏n−mai!aiai−2(nn−m−2i=1∏n−mai)2
n!m∑ym(n−m)!n2n−2m−4∑ai=n∑i=1∏n−mai!aiai (合并了 $\prod a_i^2 $ 和 ∏aiai−2)
下标代换 m←n−m
n!n−4ynm=1∑ny−mm!n2m∑ai=n∑i=1∏mai!aiai
后面和 OP=1 类似还是个卷积的 [xn]
那么
n!ynn−4∑y−mm!n2m[xn](∑j!jjxj)m
把前面的整合进去
n!ynn−4[xn]∑m!(n2y−1∑j!jjxj)m
后面的求和就是
exp{n2y−1∑i!iixi}
多项式 Exp 即可
最后还有一开始就提出去的 yn
离谱