CF451E Devu and Flowers
首先列出生成函数
带了分母并不好算,所以将 \(1/(1-x)\) 提出来
前面那一坨可以 \(\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)\),那么式子可以转化为
如何求解 \(g_i(x)\)?显然可以多项式求 \(\ln\),但 \(f_i(x)\) 已知,所以可以直接算
所以
于是
于是可以暴力枚举生成 \(\ln{\rm ans}(x)\),再求 \(\exp\) 即可。
[MtOI 2018] 情侣?给我烧了!
一些闲话:妈咪妈咪哄!学校现充快退散 !
一看到 "恰好" 就想到二项式反演,但这题是多组询问,直接用反演得到的柿子求解也会超时,所以还是需要手推一下什么的。这里就只推另一种方法了。
令 \(D_{n}\) 为 \(n\) 对情侣不和睦的方案数,那么有
也就是选择 \(k\) 对情侣,\(k\) 排座位,和睦情侣入座顺序,情侣与座位的对应关系。
现在的目标是求出 \(D_n\),所以我们要尽量将柿子化成生成函数运算。将 \(f(n,0\sim n)\) 求和,就可以得到
"\(n-k\)" 与 "\(k\)" 提示卷积,也就是说可以尝试将左式变成两个函数卷起来的结果,所以按此意愿分配组合数
将 \(n!\cdot n!\) 移项,右边就可以变成组合数 \(\dbinom{2n}{n}\),这个玩意 \(\mathtt{OGF}\) 的封闭形式在 \(\text{[TJOI 2015] }\)概率论 中推导过,不过是反着推的,可能题做多了就会敏感了吧 。记 \(D(x)\) 为 \(\dfrac{D_n}{(n!)^2}\) 的 \(\mathtt{OGF}\),那么有
不过这里还是记录一下正向推导吧。这个方法的大体思路是将组合数 \(\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}} \]
接着上文的来讲,就有
也算是新学的一个 \(\rm trick\) 吧,求解 \(D(x)\) 的递推式可以将其求导,算出一个导函数与原函数的关系式,再通过关系式得到导函数与原函数在系数上的关系式,最后利用 \([x^n]D'(x)=(n+1)[x^{n+1}]D(x)\) 的性质把关系式中的所有导函数系数换成原函数系数,就得到关于原函数系数的递推式了。具体过程就不再叙述。
玩游戏
推推柿子可以得到
其中 \(A_i(x)=\displaystyle \sum_j \frac{a_i^j}{j!}\cdot x^j\),\(B_i(x)\) 同理。于是问题转化为快速求
首先可以把恼人的 \(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)\),也就是
说明一下为啥要把 \(\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)\) 的。