拓展拉格朗日反演学习笔记

先给出公式:
\([x^n]H(G(x)) = \frac{1}{n}[x^{n-1}]((\frac{x}{F(x)})^n * H'(x))\)

  • 其中\(F(x) =G^{-1}(x),即F(G(x)) = G(F(x)) = x\)
  • 条件貌似是\(H(0) = 0\)
  • \(H(x) = x\)时,就是拉格朗日反演

证明:略不会

例题:

大朋友与多叉树 \((*\ easy)\)

  • 题意:定义一棵树是好的,当且仅当其有\(s\)个儿子,且每个点的儿子个数\(\in D\),\(D\)是一个给定的集合.求好的树的个数,对一个\(ntt\)模数取模.(有标号)
  • 设树的生成函数为\(T(x)\),其中\(T(x)[x^n]\)表示有\(n\)个叶子的方案
  • 那么\(T = x + \sum_{i \in D}T^i\)
  • 移项,有\(T - \sum_{i \in D}T^i = x\)
  • \(G(x) = x - \sum_{i \in D}x^i\),则\(G(T) = x\)
  • 考虑拉格朗日反演,则
  • \(T(x)[x^n] = \frac{1}{n}(\frac{x}{G(x)})^n[x^{n-1}] = \frac{1}{n}{\frac{1}{(\frac{G(x)}{x})^n}}[x^{n-1}]\).
  • 注意\(G(x)\)没有常数项,但有一次项.所以\(G(x)没有逆,但\frac{G(x)}{x}有逆\).这一点对于所以复合逆似乎都是成立的.
  • 多项式快速幂即可

\(FJOI2020D2T2\) \((*\ median)\)

  • 题意简述:多组询问,求一个\(n*(k-2)+2\)边形的\(k\)角剖分方案数.对小质数取模
  • \(n,k \leq 5e5,k \geq 3\)
  • solution:
  • 题意即要求将一个多边形划分成\(n\)\(k\)边形的方案数.
  • 我们考虑枚举每一条在多边形上的边,它一定属于某个\(k\)边形,剩下的\(k-1\)条边至多会把该多边形划分成\(k-1\)个区域,对应于区分儿子的无标号\(k-1\)叉树方案数.
  • 考虑生成函数.有\(F(x) = x * F(x)^{k-1} + 1,F(x)[x^0] = 1,ans = F(x)[x^n]\).
  • \(G = F - 1\).
  • \(G = x * (G + 1)^{k-1}\)这一步主要是为了消去常数项
  • 那么有\(\frac{G}{(G+1)^{k-1}} = x\)
  • 拉格朗日反演即可.答案为:
  • \(\frac{\binom{k*n-n}{n-1}}{n}\)

\(ZJOI2020抽卡(*\ hard)\)

  • 题意简述:给一个序列(里面的数字不一定连续),每次等概率随机抽取一个数字.抽取完序列仍存在这个数字.若当前抽取到的数字在之前已经被抽取过了,什么事都不会发生.求第一次抽取到连续的\(k\)个数字的期望时间.
  • \(m,k \leq 5e5\)
  • solution:
  • 考虑\(minmax\)容斥,假设只有一个连续段,设\(Emax(T)\)表示抽完这个连续段的时间,那么对应的\(Emin(T)\)表示第一次抽取到这个连续段的某个元素的时间
  • 所以:\(Emax(S) = \sum_{T \subseteq S}(-1)^{|T|-1}*Emin(T)\).
  • 注意到等概率,即只跟个数有关.设\(f(|T|) = Emax(T)\)
  • 那么有\(f(k) = \sum_{i=1}^{k}\binom{k}{i}(-1)^{i-1}*\frac{m}{i}\)
  • 考虑逆用\(minmax\)容斥,把每个连续段当作一个元素,我们考虑设\(Emin(S)\)表示抽到第一个连续段的时间.设\(C(T)\)表示集合\(T\)中的连续段并起来的长度,\(Emax(T)\)表示把\(C(T)\)个元素全抽完的期望时间,所以\(Emax(T) = f(C(T))\)

\[\begin{aligned} Emin(S) &= \sum_{T \subseteq S}(-1)^{|T|-1}\sum_{i = 1}^{C(T)}(-1)^{i-1}*\\\binom{C(T)}{i}\frac{m}{i}\\ &= \sum_{k = 1}^{m}\sum_{i=1}^{k}\binom{k}{i}*(-1)^{i-1}\frac{m}{i}\\*(\sum_{T \subseteq S}(-1)^{|T|-1}[C(T) == k]) \end{aligned}\]

直接\(dp\)后面的并的贡献是\(m^3\)的,有\(50pts\).稍微前缀和优化一下就是\(m^2\),有\(70pts\)
先给个暴力的代码吧:(莫名多跑了10分):50pts code

正解(100分做法)

  • 似乎有更好的做法,不用\(MinMax\)容斥
  • 这里参考了\(fuyuki\)大神的做法
  • 我们考虑拆开考虑贡献,注意到非法状态一定可以变成合法状态,且合法状态一定不会变成非法状态
  • 我们考虑答案可以等价于每种非法状态的期望进行下一步转移的次数
  • 注意到所有已经有\(r\)张牌的非法状态出现的概率都是\(\frac{1}{\binom{r}{m}}\),且期望进行下一步转移的次数都是\(\frac{m}{m-r}\)
  • 那么问题就等价于对于所有\(r\),计算已经有\(r\)张牌的非法状态数量
  • 对于每个连续段分别考虑这一个问题的生成函数,最后再乘起来,按长度排序乘起来时间复杂度是\(O(m\log^2 m)\)
  • 不妨假设当前这一段长度为\(n\),那么设\(F(z) = \sum_{i = 0}^{k-1}z^{i+1}\),意即放\([0,k-1]\)\(1\),再强制塞一个\(0\),(\(1\)表示抽中的卡),注意到塞了\(r\)\(0\),就会抽中\(n + 1 - r\)次卡,那么我们要计算的便是\(:\)
  • \(\forall r,F(z)^r[z^{n+1}]\)
  • 考虑添加辅元\(u\),以便于分别不同的\(r\),那么我们要求的便是\(H(z,u) = \sum_{r}u^r*F(z)^r[z^{n+1}] \\ = \frac{1}{1 - u*F(z)}[z^{n+1}]\)
  • 考虑对\(z\)这一元拉格朗日反演,注意此处演出来的结果会是一个关于\(u\)的多项式
  • 假设\(F^{-1}(z) = G(z)\)
  • 那么\(H(z,u)[z^{n+1}] = \frac{1}{n}(\frac{1}{1-uz})' * (\frac{z}{G(z)})^n[z^n]\)
  • \(P(z) = (\frac{z}{G(z)})^n\)
  • 所以\(H(z,u)[z^{n+1}] = \frac{1}{n}\sum_iu^{i+1}(i+1)P(z)[z^{n-i}]\)
  • 到这一步已经非常显然了,我们只要求出\(P(z)\),算对应的系数就可以了
  • 那么只剩下一个问题了,\(G(z) = F^{-1}(z)\)怎么算
  • 注意到\(F(z) = z * \frac{1 - z^k}{1 - z}\)
  • \(F(G(z)) = z\)等价于\(G(z)^{k+1} - (z + 1)*G(z) + z = 0\)
  • 牛顿迭代即可(不过真的又恶心常数又大)
  • code
  • 常数大得不行,只有70分,不如dp
  • \(upd\),经过不懈的卡常,现在过了
posted @ 2021-03-28 19:15  y_dove  阅读(452)  评论(0编辑  收藏  举报