GDOI模拟 装饰

来源:互联网 发布:婚礼地图制作软件 编辑:程序博客网 时间:2024/05/16 06:13

题目大意

有一个2M的彩带,彩带的每个格子都可以染上红色,蓝色,绿色中的一种颜色,一个彩带被称为合法的,当且仅当
1. 相邻两个格子的颜色不同
2. 对于每个2*2的小矩阵三种颜色都要出现
3. 整个彩带上有R个红色格子,B个蓝色格子,G个绿色格子。

给定M,R,B,G,求可能的合法彩带数。对109+7取模。

数据范围

R+B+G=2M,0M1000000

题解

我们不妨设Ai表示第i列没有出现的颜色,且满足AiAi1。那么很显然地,假如我们确定了第一列的状态,以及所有的Ai,我们就唯一确定了这条彩带。因此,我们把原问题转化为给一个长度为M的序列染上三种颜色,相邻格子颜色不能相同,并且每种颜色有数量限制。

考虑枚举A1,设X为开头颜色的数量,Y,Z为剩下两种颜色的数量。假如所有开头颜色确定了其在序列中放的位置,那么剩下的格子就要被分为X段或X1段,X1段是因为开头颜色可能可以放在结尾。设G为最终分成的段数。对于每一段,我们分其长度为偶数或奇数两种情况考虑。

我们可以枚举最终有e段偶数,对于每段偶数段,必然是YZYZYZZYZYZY的形式,因为需要保证相邻不相同。因为每一段都不能是空的,因此我们可以先给每段偶数段都先加入一个Y,Z,那么这两种颜色剩下的数量就是Ye,Ze

对于奇数段的,假如我们确定了开头是Y还是Z,那么接下来还是类似于偶数段,只是形式已经确定了。假设最终有oy段奇数段开头为Y,oz段为Z,那么我们可以列出方程组
oy+oz=Ge
yoy=zoz

对于第二条等式,是因为你除了开头以外总是要保证Y,Z相邻,那么数量自然相同。那么我们就可以解出oy,oz了。

接下来考虑e段为偶数的贡献就是
(Ge)(Geoy)2e(yoye+g1g1)

第一条式子就是从G段中选出e段偶数段,接下来就是从Ge段奇数段中分配oy段给Y,然后对于每段偶数段,都可以选择Y开头或Z开头,因此是2e,最后一项是统计还剩下yoyeY,要把他们分配到g段中,注意每往一段中加入一个Y,必然要伴随一个Z,因此只需要考虑Y的分配即可。并且因为我们一开始已经往每一段中加入了一些YZ,所以最终分配时允许某一段分配为空,这就是一个挡板问题。

最终时间复杂度就是O(N),空间复杂度也是O(N)

0 0
原创粉丝点击