标签:Balls sum 那么 xF Other PolandBall 2n 我们 式子
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。