zoukankan      html  css  js  c++  java
  • P5206 [WC2019]数树

    哈哈,毒瘤题全靠大佬带飞,自己根本做不得。

    op=0

    首先我们分析一波权值,可以得到,权值只与树的连通块个数有关,其中两点相连当且仅当两点的边在两棵树上都存在,我们不妨设公共边的数量为 (k) 。答案应该就是 (y^{n-k})

    感谢出题人送的温暖。

    op=1

    我们依旧考虑上面的公共边的想法。

    我们可以选择一些公共边,那么剩下的部分,实际上就是类似于一个任意生成树的过程。

    公式

    已知有 (n) 个点 (k) 棵树的森林,每棵树的大小为 (a_i) ,那么该森林的生成树个数是:

    [n^{k-2}prod_{i=1}^ka_i ]

    证明略。

    我们不妨定义边集 (S) 表示钦定的公共边,剩下的随意,这样实际上就是可以容斥的。我们因此定义 (f_S) 表示至少的数量,(g_S) 表示刚好的数量。

    [f_S=sum_{Ssubseteq T}g_T\ g_S=sum_{Ssubseteq T}(-1)^{|T|-|S|}f_T ]

    我们考虑如何计算 (f_S) ,实际上就是上面的式子。

    [f_S=n^{n-|S|-2}prod_{i=1}^{n-|S|}a_i\ ]

    然后我们实际上需要求的是:

    [ ext{res}=sum_Sy^{n-|S|}g_S\ =sum_Sy^{n-|S|}sum_{Ssubseteq T}(-1)^{|T|-|S|}n^{n-|T|-2}prod_{i=1}^{n-|T|}a_i\ =y^nn^{n-2}sum_S(frac{-1}{y})^{|S|}sum_{Ssubseteq T}(frac{-1}{n})^{|T|}prod_{i=1}^{n-|T|}a_i ]

    然后我们发现对于 (S) 这个集合,实际上我们并没有形态的限制,我们只需要知道其是 (T) 的子集即可。所以我们选择调换这里两个集合的枚举顺序,然后这个集合 (S) 的枚举结果应该是可以直接算的。

    [ ext{res}=y^nn^{n-2}(sum_{T}(frac{-1}{n})^{|T|}prod_{i=1}^{n-|T|}a_i)(sum_{Ssubseteq T}(frac{-1}{y})^{|S|})\ =y^nn^{n-2}(sum_{T}(frac{-1}{n})^{|T|}prod_{i=1}^{n-|T|}a_i)(sum_{i=0}^{|T|}inom{|T|}{i}(frac{-1}{y})^i)\ ]

    好像不能直接算?但是可以预处理的吧,我们就直接设这个东西的值为 (h_i)

    [ ext{res}=y^nn^{n-2}sum_{T}(frac{-1}{n})^{|T|}h_{|T|}prod_{i=1}^{n-|T|}a_i\ ]

    不太对劲,这个式子好丑。这个 (h_i) 不能在树上拆开,意味着我们可能不能很好的计算贡献。

    哦,我悟了,上面的这个不就是一个二项式定理的展开式,合并回去就行了。

    [ ext{res}=y^nn^{n-2}sum_{T}(frac{-1}{n})^{|T|}(1-frac{1}{y})^{|T|}prod_{i=1}^{n-|T|}a_i\ =y^nn^{n-2}sum_{T}(frac{1}{ny}-frac{1}{n})^{|T|}prod_{i=1}^{n-|T|}a_i\ ]

    然后这个式子漂亮的不行,应该可以直接在树上搞。

    我们考虑这个实际上非常类似于氪金手游的思路。即权值是和我们钦定的连通块的大小有关的。但是贡献的计算略有不同,氪金手游是每一个点都计算一次,而这题是每一个连通块是只计算一次的,所以我们可以考虑将这个连通块的权值放到连通块最上方的那个节点来计算。

    我们不妨也在这里枚举连通块大小,用 (h_{u,i}) 表示子树 (u)(u) 下方连通块大小为 (i) 的答案。

    注:由于考虑所有子树写式子太麻烦了,而且在实际操作中我们肯定是选择让子树与根两两合并,所以接下来我们就假定每次操作都是子树和父亲的合并。

    [h_{u,i}=sum_{v,0<j<i}(frac{1}{ny}-frac{1}{n})h_{u,i-j}h_{v,j}+h_{u,i}sum_{v,j}jh_{v,j}\ ]

    然后这个式子直接向氪金手游里一样去搞的话应该是 (O(n^2)) 的,恭喜你推了半天获得了 (24pts) !!!

    我们考虑这个式子我们能否加速?

    不 wei 加速。

    然后我们意识到两边的系数同时只会计算一个,所以我们不妨将所有的贡献先乘上然后再除去。

    [ ext{res}=y^nn^{-2}(frac{1}{y}-1)^nsum_{T}prod_{i=1}^{n-|T|}frac{ny}{1-y}a_i\ h_{u,i}=sum_{v,0<j<i}h_{u,i-j}h_{v,j}+h_{u,i}sum_{v,j}jfrac{ny}{1-y}h_{v,j}\ ]

    这样所有的系数都被我们放到右边了。

    我们可以发现,这实际上是一个树上背包的过程,但是我们考虑我们最后实际上是只需要知道所有贡献的和,不需要知道具体多大的连通块的贡献是是多少,我们能否降低维护的要求?

    我们从多项式的角度来思考,令(H_v=sum_ih_{v,i}x^i)

    我们的转移实际上可以这样看:

    [H_u=H_ucdot H_v+frac{ny}{1-y}H'_v(1)cdot H_u\ ]

    而我们最后的答案实际上就是 (frac{ny}{1-y}H_{ ext{rt}}'(1))

    我们考虑单独维护这个 (H'_u(1))

    [H'_u=H'_ucdot H_v+H_ucdot H'_v+frac{ny}{1-y}H'_v(1)cdot H'_u\ H'_u(1)=H'_u(1)cdot H_v(1)+H_u(1)cdot H'_v(1)+frac{ny}{1-y}H'_v(1)cdot H'_u(1)\ ]

    我们还需要维护 (H_u(1))

    [H_u(1)=H_u(1)cdot H_v(1)+frac{ny}{1-y}H'_v(1)cdot H_u(1) ]

    然后搞定!!!

    到现在你已经有了(56pts) 了!!!

    opt=2

    但是由于两棵树都是不确定的,我们可以考虑选出一些点来组成森林,然后再在这个森林里容斥。

    我们设集合 (mathbb S) 表示森林的树集, (S_iinmathbb S) 表示每一棵树的点集,易得 (S_i) 两两不交且 (sum_i|S_i|=n)

    我们同样设 (f_mathbb S) 为至少,(g_mathbb S) 为恰好。

    [f_mathbb S=(n^{|mathbb S|-2}prod_{S_iinmathbb S}|S_i|)^2prod_{S_iinmathbb S}|S_i|^{|S_i|-2}\ =n^{2|mathbb S|-4}prod_{S_iinmathbb S}|S_i|^{|S_i|}\ g_mathbb S=sum_{mathbb Ssubseteqmathbb T}(-1)^{|mathbb T|-|mathbb S|}f_{mathbb T}\ =sum_{mathbb Ssubseteqmathbb T}(-1)^{|mathbb T|-|mathbb S|}n^{2|mathbb T|-4}prod_{S_iinmathbb T}|S_i|^{|S_i|}\ ]

    (g_mathbb S=sum_{mathbb Ssubseteqmathbb T}(-1)^{|mathbb T|-|mathbb S|}f_{mathbb T})的式子成立的前提,是(f_{S}=sum_{Ssubseteq T}g_T),然而之前已经指定 (sum_i|S_i|=n) ,这样的子集关系成立吗?

    (可能还是在于对自己推导的式子的含义不太清晰?每定义一个量,最好将其真正的含义是什么弄明白,这样就基本错不了)

    那么我们的答案就是:

    [ ext{res}=sum_{mathbb S}y^{|mathbb S|}sum_{mathbb Ssubseteqmathbb T}(-1)^{|mathbb T|-|mathbb S|}n^{2|mathbb T|-4}prod_{S_iinmathbb T}|S_i|^{|S_i|}\ =n^{-4}sum_{mathbb S}(-y)^{|mathbb S|}sum_{mathbb Ssubseteqmathbb T}(-n^2)^{|mathbb T|}prod_{S_iinmathbb T}|S_i|^{|S_i|}\ ]

    同理我们运用一下这个不交的性质,可以发现值与 (mathbb T) 的形态无关,只与其中集合的大小有关,同样还是设大小为 (a_i) 。同时发现这个 (mathbb S) 还是与其具体形态无关,只与大小有关,我们考虑调换枚举顺序。

    [ ext{res}=n^{-4}(sum_{mathbb T}(-n^2)^{|mathbb T|}prod_{a_i}a_i^{a_i})(sum_{mathbb Ssubseteqmathbb T}(-y)^{|mathbb S|})\ =n^{-4}sum_{mathbb T}(-n^2)^{|mathbb T|}(1-y)^{|mathbb T|}prod_{a_i}a_i^{a_i}\ =n^{-4}sum_{mathbb T}(yn^2-n^2)^{|mathbb T|}prod_{a_i}a_i^{a_i}\ ]

    然后我们发现,对于这个 (mathbb T) 集合的枚举,实际上就是我们之前搞过的从一个大小固定的集合中选出若干个没有顺序的集合,每一个贡献至于其大小有关,实际上就是一个 (exp) 。我们先枚举集合个数,然后分配标号,同时消除顺序。

    [ ext{res}=n^{-4}sum_{k=|mathbb T|}frac{1}{k!}(yn^2-n^2)^kinom{n}{a_1,a_2,...,a_k}prod_{i=1}^ka_i^{a_i}\ =n^{-4}n!sum_{k=|mathbb T|}frac{1}{k!}prod_{i=1}^kfrac{a_i^{a_i}}{a_i!}(yn^2-n^2)\ ]

    然后我们设一个多项式是 (f=sum_ii^i(yn^2-n^2))

    右边实际上就是 (e^{hat f})

    [ ext{res}=n^{-4}n![x^n]e^{hat f} ]

    我艹我的推法竟然和大佬不一样,这是好的。

    感觉自己巨大多推错,完蛋了。


    前面都推错了,悲。错误原因已经标在上面了。

    这里的定义问题如果去掉这个限制的话,好像后面求答案的时候我们就需要加上这个限制了,然后后面求 (mathbb T)(exp) 的时候就不能简单地取第 (n) 项了。


    我们来考虑 (op=1) 时的一个式子。

    [ ext{res}=y^nn^{n-2}sum_{Tsubseteq E_1}(frac{1}{ny}-frac{1}{n})^{|T|}prod_{i=1}^{n-|T|}a_i\ ]

    我们考虑我们在此时是不知道 (E_1) 的,我们能否考虑直接暴力统计方案?

    [ ext{res}=y^nn^{n-2}sum_{T}((frac{1}{ny}-frac{1}{n})^{|T|}prod_{i=1}^{n-|T|}a_i)(n^{n-|T|-2}prod_{i=1}^{n-|T|}a_i)\ ]

    存在的一个疑问是我们可能会算重。但是实际上我们并不会算重,因为这个式子实际上是在对于每一个 (E_1) 做上面的式子,而上面的式子是并不会算重的。

    我们考虑将所有的 (n-|T|) 次项丢到 (prod) 里。

    [ ext{res}=y^nn^{-4}sum_T(frac{1}{y}-1)^{|T|}prod_{i=1}^{n-|T|}n^2a_i^2\ =(1-y)^nn^{-4}sum_Tprod_{i=1}^{n-|T|}frac{y}{1-y}n^2a_i^2\ ]

    我们考虑这个边集枚举的是什么,实际上是若干个连通块,我们直接考虑枚举连通块个数然后分配标号。

    [ ext{res}=(1-y)^nn^{-4}sum_{k=n-|T|}frac{1}{k!}inom{n}{a_1,a_2,...,a_k}prod_{i=1}^kfrac{y}{1-y}n^2a_i^2\ =(1-y)^nn^{-4}n!sum_{k=n-|T|}frac{1}{k!}prod_{i=1}^kfrac{1}{a_i!}frac{y}{1-y}n^2a_i^2\ ]

    我们考虑设一个多项式 (h=sum_ifrac{y}{1-y}n^2i^2x^i)

    [ ext{res}=(1-y)^nn^{-4}n!sum_{k}frac{[x^n]hat h^k}{k!}\ =(1-y)^nn^{-4}n![x^n]e^{hat h} ]

    然后就好了。

  • 相关阅读:
    css一div内文字居中
    (三)maven出错记录
    (二)在eclipse中使用maven
    单点登录原理及实现sso
    java定时器2-spring实现
    内存溢出
    IDE配置jvm参数
    CheckStyle
    表单提交数据量大于2m,java 后台接受不到表单传递过来的数据
    JVM实用参数(一)JVM类型以及编译器模式
  • 原文地址:https://www.cnblogs.com/Point-King/p/15482076.html
Copyright © 2011-2022 走看看