CF755G PolandBall and Many Other Balls
作者:互联网
CF755G PolandBall and Many Other Balls
题目分析:
(只会倍增FFT选手前来报道)
首先根据这个题意可以列出一个 dp,设 \(f_{n, k}\) 表示 \(n\) 个球分成 \(k\) 组的方案数。那么我们有如下的式子。
\[f_{(n,k)}=f_{(n-1,k)} +f_{(n-1, k-1)} +f_{(n-2, k-1)} \]简单来说就是枚举最后一个球的分组情况是什么。但是很明显是不能通过这个题的。
因此我们可以进行如下的考虑,我们把 \(a\) 长度的球和 \(b\) 球拼成 \(a+b\) 的球,那么分为两种的情况。
如果说中间一段不进行合并的话,那么就是
\[f_{(a+b,k)} = \sum_{i=0}^{k}f_{(a,i)}f_{(b,k-i)} \]第二种情况就是中间的那一段进行合并的话,我们有
\[f_{(a+b,k)}=\sum_{i=0}^{k-1}f_{a-1,i}f_{b-1,k-i-1} \]那么合起来的话,其实就是
\[f_{(a+b, k)} =\sum_{i=0}^{k}f_{(a,i)}f_{(b,k-i)}+\sum_{i=0}^{k-1}f_{a-1,i}f_{b-1,k-i-1} \]我们进行观察的话发现上面的 dp 转移十分像一个卷积的形式,所以我们考虑是否能不能把 \(f\) 数组写成多项式的形式。形式化的,我们可以写出 \(f\) 的生成函数 \(\displaystyle F_n(x) = \sum_{k=0}^{\infty}{f_{(n,k)}x^k}\)
那么之前的式子可以变成
\(F_{a+b}(x) = F_a(x)F_b(x) + xF_{a-1}(x)F_{b-1}(x)\)
\(F_n(x)=F_{n-1}(x)+xF_{n-1}(x)+xF_{n-2}(x)\)
那么我们根据这个式子可以看出
\[\begin{cases} F_{2n}(x) = F_{n}^2(x) + xF_{n-1}^2(x) \\ F_{2n-1}(x)=F_{n}(x)F_{n-1}(x) + xF_{n-1}(x)F_{n-2}(x) \\ F_{2n-2}(x)=F_{n-1}^2(x)+xF_{n-2}^2(x) \end{cases} \]这样的话我们就可以实现从 \(F_{n-2}(x),F_{n-1}(x),F_n(x)\) 转移到 \(F_{2n-2}(x),F_{2n-1}(x),F_{2n}(x)\) 了。所以此时我们讲 n 二进制分解,从高位向低位进行扫一遍,类似于快速幂的实现方式,如果末尾遇到了 1,那么直接从 \(F_{n-1}(x) \to F_{n}(x)\) ,否则的话我们从 \((x) \to (2x)\) 即可。
Code:
由于本人繁忙,并没有时间写本题代码,所以贴一份 std。-By Here
标签:Balls,sum,那么,xF,Other,PolandBall,2n,我们,式子 来源: https://www.cnblogs.com/Zwaire/p/16147347.html