ARC089D ColoringBalls

题意:有 个白色的小球排成一排,有一个长为 的字符串

接下来进行 次操作。

对于第 个操作,选择一段连续的小球(可以为空),若 则将这些球染成红色;若是 ,则将它们染成蓝色。

由于染料的特性,不能直接用蓝色来染白色。

求在进行完所有操作后,所有小球的颜色序列可以有多少种。答案对 取模。

,时限


首先考虑如何判定某种颜色序列是否能被生成。

  • 连续的一段有色区间

    可能分布为 红蓝红蓝...红蓝红。

    考虑有怎样的构造方案,如下图:

    • 先考虑染色次数:

      若有 个蓝色段,则所需的染色次数为 次,红色和蓝色的次数不定,在 之间。(特殊地,若没有蓝色,则只需染一次红色)

    • 再考虑染色顺序:

      若我们决定染 次蓝色,最好的方案是:先染一次红色,再染 段蓝色,然后染一大段蓝色,再在这段蓝色上染完剩下的红色。

    • 总结操作序列的要求:满足个数要求。且最前面是 ,第二个是 。没了!

  • 多段有色区间

    设有 个纯红色段,以及 个杂色段。

    则在操作序列中取出 个尽量靠前的子序列 ,再取出 个尽量靠前的 。后者用于处理纯红色段。

    然后,从左到右考虑,将第 分给第 的杂色段,并在后面取走想要的若干个操作。

    若发现无球可取,则无解。

    形式化地,记第 后面剩余的操作数目为

    个杂色段的内部段数和为 。(降序

    则对于所有 ,都要满足


接下来考虑计数。

枚举 ,然后我们得到了

先考虑在得到 的情况下,如何计算颜色序列的方案数。

将每一个“颜色段”看做一个盒子。

我们发现,对于一个 ,会产生 个至少有一个球的颜色段,以及 可以为空的颜色段(两端的红球)。

对于 ,会产生 个至少有一个球的颜色段。

对于白色的部分,会产生 个至少有一个球的颜色段,以及 个可以为空的颜色段(两端的白球)。

综上,非空盒的个数为 个,而可空盒为 个。

总球数为 ,容易用组合数求出方案。

此外,杂色段和纯红色段之间的顺序也需要考虑。

首先是杂色段和纯红色段混合的方案数,显然为

然后是杂色段内部顺序数,即 序列的不同排列数,这个使用 求解。


表示填写了 ,目前 ,且 的方案数(不同排列数)。

枚举在 中选多少个 ,则有转移 :

式子中 是将 归并到目前的 中的方案数。

要求

最终的答案是 ,根据第二维的 计算贡献系数。

使用前缀和优化,即可做到

算上枚举 的复杂度,总复杂度为 。由于常数非常小,可以轻松通过。