• [题目小结] 生成函数


    CF451E Devu and Flowers

    首先列出生成函数

    \[\begin{align}F(x)&=\prod_{k=1}^n \left(\sum_{i=0}^{f_k}x^i\right)\\&=\prod_{k=1}^n \left(\frac{1-x^{f_k+1}}{1-x}\right)\end{align} \]

    带了分母并不好算,所以将 \(1/(1-x)\) 提出来

    \[\begin{align}&=\frac{1}{(1-x)^n}\cdot \prod_{k=1}^n (1-x^{f_k+1})\\&=\left(\prod_{k=1}^n (1-x^{f_k+1})\right)\cdot \sum_{i=0}^{\infty}\binom{n-1+i}{i}\cdot x^i\end{align} \]

    前面那一坨可以 \(\mathcal O(2^n)\) 枚举所有 \(x^{s'}\) 的系数,对应上后面 \(x^{s-s'}\) 的系数即可。由于组合数中的 \(i\) 较大,所以还需要化简一下 \(\mathcal O(n)\) 求。

    [LOJ 6268] 分拆数

    首先对每个数字构造生成函数 \(f_i(x)=\sum_{j=0}^{\infty}(x^i)^j\),那么答案多项式 \({\rm ans}(x)=\prod_{i=1}^nf_i(x)\).

    虽然我们有 \(ij\leqslant n\),但计算这个式子仍需要 \(n\) 次长度为 \(n\) 的多项式乘法,这是不可接受的。但这也提供了一个思路:将 \(\prod\) 转化成 \(\sum\),一个非常经典的思路就是取 \(\ln\).

    \(g_i(x)=\ln f_i(x)\),那么式子可以转化为

    \[\ln {\rm ans}(x)=\sum_{i=1}^n g_i(x) \]

    如何求解 \(g_i(x)\)?显然可以多项式求 \(\ln\),但 \(f_i(x)\) 已知,所以可以直接算

    \[g_i'(x)=\frac{f_i'(x)}{f_i(x)}=\frac{\sum_{j=1}^{\infty}ij\cdot x^{ij-1}}{\frac{1}{1-x^i}}=\sum_{j=1}^{\infty}(ij-i\cdot (j-1))\cdot x^{ij-1}=\sum_{j=1}^{\infty}i\cdot x^{ij-1} \]

    所以

    \[\int i\cdot x^{ij-1}\ {\rm d}x=\frac{i}{ij}\cdot x^{ij}=\frac{x^{ij}}{j} \]

    于是

    \[\ln{\rm ans}(x)=\sum_{i=1}^n \sum_{j=1}^{\infty}\frac{x^{ij}}{j} \]

    于是可以暴力枚举生成 \(\ln{\rm ans}(x)\),再求 \(\exp\) 即可。

    [MtOI 2018] 情侣?给我烧了!

    一些闲话:妈咪妈咪哄!学校现充快退散 !

    一看到 "恰好" 就想到二项式反演,但这题是多组询问,直接用反演得到的柿子求解也会超时,所以还是需要手推一下什么的。这里就只推另一种方法了。

    \(D_{n}\)\(n\) 对情侣不和睦的方案数,那么有

    \[f(n,k)=D_{n-k}\cdot \binom{n}{k}^2\cdot 2^kk! \]

    也就是选择 \(k\) 对情侣,\(k\) 排座位,和睦情侣入座顺序,情侣与座位的对应关系。

    现在的目标是求出 \(D_n\),所以我们要尽量将柿子化成生成函数运算。将 \(f(n,0\sim n)\) 求和,就可以得到

    \[\sum_{k=0}^n D_{n-k}\cdot \binom{n}{k}^2\cdot 2^kk!=(2n)! \]

    "\(n-k\)" 与 "\(k\)" 提示卷积,也就是说可以尝试将左式变成两个函数卷起来的结果,所以按此意愿分配组合数

    \[\sum_{k=0}^n \frac{D_{n-k}}{((n-k)!)^2}\cdot \frac{n!\cdot n!}{k!}\cdot 2^k=(2n)! \]

    \(n!\cdot n!\) 移项,右边就可以变成组合数 \(\dbinom{2n}{n}\),这个玩意 \(\mathtt{OGF}\) 的封闭形式在 \(\text{[TJOI 2015] }\)概率论 中推导过,不过是反着推的,可能题做多了就会敏感了吧 。记 \(D(x)\)\(\dfrac{D_n}{(n!)^2}\)\(\mathtt{OGF}\),那么有

    \[D(x)*\text{e}^{2x}=(1-4x)^{-\frac{1}{2}} \]

    不过这里还是记录一下正向推导吧。这个方法的大体思路是将组合数 \(\text{C}(n,m)\) 的 "\(n\)" 部分换成一个常数而不是与 "\(m\)" 有关的数值,这样就可以利用广义二项式定理求解封闭形式。

    在正式推导之前有两个非常重要的次级结论:


    \(\mathcal{C}\text{onclusion 1.}\) 用于降低组合数 "\(n\)" 部的系数:

    \[\begin{align}\binom{n-1/2}{n}&=\frac{(n-1/2)\cdot ((n-1)-1/2)\cdot \dots \cdot((n-(n-1))-1/2)}{n!}\\&=\frac{(2n-1)\cdot (2n-3)\cdot \dots\cdot 1}{2^nn!}\end{align} \]

    化简到这里就可以用 "奇数开始的双阶乘" 的 \(\rm trick\) 来化简,最后能得到 \(\dfrac{\binom{2n}{n}}{4^n}\).


    \(\mathcal{C}\text{onclusion 2.}\) 用于抵消 "\(n\)" 部与 "\(m\)" 部系数相同的未知数:

    \[\binom{n}{m}=(-1)^m\cdot \frac{-n\cdot (-n+1)\cdot \dots\cdot(-n+m-1)}{m!}=(-1)^m\cdot \binom{-n+m-1}{m} \]


    于是

    \[\sum_{i=0}^{\infty}\binom{2i}{i}\cdot x^i=\sum_{i=0}^{\infty}\binom{i-1/2}{i}\cdot 4^ix^i=\sum_{i=0}^{\infty}\binom{-1/2}{i}\cdot (-4x)^i=(1-4x)^{-\frac{1}{2}} \]

    接着上文的来讲,就有

    \[D(x)=(1-4x)^{-\frac{1}{2}}*\text{e}^{2x} \]

    也算是新学的一个 \(\rm trick\) 吧,求解 \(D(x)\) 的递推式可以将其求导,算出一个导函数与原函数的关系式,再通过关系式得到导函数与原函数在系数上的关系式,最后利用 \([x^n]D'(x)=(n+1)[x^{n+1}]D(x)\) 的性质把关系式中的所有导函数系数换成原函数系数,就得到关于原函数系数的递推式了。具体过程就不再叙述。

    玩游戏

    推推柿子可以得到

    \[\text{Ans}(k)=\frac{k!}{nm}\cdot [x^k]\left(\left(\sum_{i=1}^nA_i(x)\right)*\left(\sum_{i=1}^n B_i(x)\right) \right) \]

    其中 \(A_i(x)=\displaystyle \sum_j \frac{a_i^j}{j!}\cdot x^j\)\(B_i(x)\) 同理。于是问题转化为快速求

    \[A(x)=\sum_{i=1}^n\sum_j \frac{a_i^j}{j!}\cdot x^j \]

    首先可以把恼人的 \(1/j!\) 搞掉,记 \(F(x)=\sum_{i=1}^n\sum_j a_i^jx^j\),那么有 \([x^p]A(x)=(1/p!)[x^p]F(x)\),所以只用计算 \(F(x)\) 即可。这个形式我们是非常熟悉的,即 \(F(x)=\displaystyle \sum_{i=1}^n\frac{1}{1-a_ix}\).

    计算这个东西似乎有一个通分的做法,但这里只讲另一种方法。分式令人头疼,能否去掉这个分式?我们知道,\(\ln' x=1/x\),可以尝试用这个柿子解决问题:观察到 \(\ln'(1-a_ix)=\dfrac{-a_i}{1-a_ix}\),于是记 \(G(x)=\displaystyle \sum_{i=1}^n\ln'(1-a_ix)\),那么有 \(n-G(x)x=F(x)\),也就是

    \[\begin{align}F(x)&=n-G(x)x\\&=n-x\cdot \left(\sum_{i=1}^n\ln'(1-a_ix)\right)\\&=n-x\cdot \left(\sum_{i=1}^n\ln(1-a_ix)\right)'\\&=n-x\cdot \left(\ln\prod_{i=1}^n(1-a_ix)\right)'\\\end{align} \]

    说明一下为啥要把 \(\sum\) 换成 \(\prod\)(我当初犯傻在这愣了半天),因为 \(\ln\) 求解过程实际上是泰勒展开,在这里要展开到 \(x^k\) 项,所以复杂度是 \(\mathcal O(n^2\log n)\) 的 ψ(`∇´)ψ.

    对于 \(\displaystyle \prod_{i=1}^n(1-a_ix)\),可以分治进行计算,复杂度是 \(\mathcal O(n\log^2 n)\) 的。

  • 相关阅读:
    [汇编语言学习笔记][第一章基础知识]
    4月17日比较想学的东西
    java线程系列之三(线程协作)
    java线程之二(synchronize和volatile方法)
    java线程系列文章之一(线程的安全性)
    Java中的Runnable、Callable、Future、FutureTask的区别
    java的泛型
    java的动态代理
    java的反射机制(第三篇)
    java的反射机制(第二篇)
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/14496796.html
Copyright © 2020-2023  润新知