其他分享
首页 > 其他分享> > CF755G PolandBall and Many Other Balls

CF755G PolandBall and Many Other Balls

作者:互联网

CF755G PolandBall and Many Other Balls

Link

题目分析:

只会倍增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