ARC089D ColoringBalls
题意:有
接下来进行
对于第
由于染料的特性,不能直接用蓝色来染白色。
求在进行完所有操作后,所有小球的颜色序列可以有多少种。答案对
首先考虑如何判定某种颜色序列是否能被生成。
连续的一段有色区间
可能分布为 红蓝红蓝...红蓝红。
考虑有怎样的构造方案,如下图:
先考虑染色次数:
若有
个蓝色段,则所需的染色次数为 次,红色和蓝色的次数不定,在 之间。(特殊地,若没有蓝色,则只需染一次红色) 再考虑染色顺序:
若我们决定染
次蓝色,最好的方案是:先染一次红色,再染 段蓝色,然后染一大段蓝色,再在这段蓝色上染完剩下的红色。 总结操作序列的要求:满足个数要求。且最前面是
,第二个是 。没了!
多段有色区间
设有
个纯红色段,以及 个杂色段。 则在操作序列中取出
个尽量靠前的子序列 ,再取出 个尽量靠前的 。后者用于处理纯红色段。 然后,从左到右考虑,将第
个 分给第 大的杂色段,并在后面取走想要的若干个操作。 若发现无球可取,则无解。
形式化地,记第
个 后面剩余的操作数目为 。 第
个杂色段的内部段数和为 。(降序) 则对于所有
,都要满足 。
接下来考虑计数。
枚举
先考虑在得到
将每一个“颜色段”看做一个盒子。
我们发现,对于一个
对于
对于白色的部分,会产生
综上,非空盒的个数为
总球数为
此外,杂色段和纯红色段之间的顺序也需要考虑。
首先是杂色段和纯红色段混合的方案数,显然为
然后是杂色段内部顺序数,即
设
枚举在
要求
最终的答案是
使用前缀和优化,即可做到
算上枚举