CF755G PolandBall and Many Other Balls

1|0CF755G PolandBall and Many Other Balls

Link

1|1题目分析:

只会倍增FFT选手前来报道

首先根据这个题意可以列出一个 dp,设 fn,k 表示 n 个球分成 k 组的方案数。那么我们有如下的式子。

f(n,k)=f(n1,k)+f(n1,k1)+f(n2,k1)

简单来说就是枚举最后一个球的分组情况是什么。但是很明显是不能通过这个题的。

因此我们可以进行如下的考虑,我们把 a 长度的球和 b 球拼成 a+b 的球,那么分为两种的情况。

如果说中间一段不进行合并的话,那么就是

f(a+b,k)=i=0kf(a,i)f(b,ki)

第二种情况就是中间的那一段进行合并的话,我们有

f(a+b,k)=i=0k1fa1,ifb1,ki1

那么合起来的话,其实就是

f(a+b,k)=i=0kf(a,i)f(b,ki)+i=0k1fa1,ifb1,ki1

我们进行观察的话发现上面的 dp 转移十分像一个卷积的形式,所以我们考虑是否能不能把 f 数组写成多项式的形式。形式化的,我们可以写出 f 的生成函数 Fn(x)=k=0f(n,k)xk

那么之前的式子可以变成

Fa+b(x)=Fa(x)Fb(x)+xFa1(x)Fb1(x)

Fn(x)=Fn1(x)+xFn1(x)+xFn2(x)

那么我们根据这个式子可以看出

{F2n(x)=Fn2(x)+xFn12(x)F2n1(x)=Fn(x)Fn1(x)+xFn1(x)Fn2(x)F2n2(x)=Fn12(x)+xFn22(x)

这样的话我们就可以实现从 Fn2(x),Fn1(x),Fn(x) 转移到 F2n2(x),F2n1(x),F2n(x) 了。所以此时我们讲 n 二进制分解,从高位向低位进行扫一遍,类似于快速幂的实现方式,如果末尾遇到了 1,那么直接从 Fn1(x)Fn(x) ,否则的话我们从 (x)(2x) 即可。

1|2Code:

由于本人繁忙,并没有时间写本题代码,所以贴一份 std。-By Here


__EOF__

本文作者Zwaire
本文链接https://www.cnblogs.com/Zwaire/p/16147347.html
关于博主:这个世界除了你,都知道我喜欢你
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Zwaire  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示