题目描述
以以下规则,用红蓝绿三种颜色填充一个 2×n 的表格。
- 相邻的格子颜色不能相同。有公共边的格子就被视为是相邻的了。
- 每个 2×2 的格子内,每种颜色都至少要出现一次。
答案对 109+7 取模
n≤106
分析
首先这个约束是非常紧的。
考虑将它取反,也就是说求出每一列没出现的颜色,排成一行,对应的每种颜色
ci
的数量变成
n−cntci
。
那么两行的信息,就可以通过这一列反色的信息,以及两行开头一列的排列顺序确定下来。
对应的,因为 2×2 方格内不能有缺失,所以反串也不能有连续相同的颜色。
那么我们先填充开头的颜色,记它的数量为
x
,于是整个序列就会被划分成若干段空白,当最后一位被选了,空白段数就是
其中有一部分是奇数的,一部分是偶数的。
枚举一下有多少段是奇数的,记为
odd
,那么偶数段数就可以算出来,是
cnt−odd
。而且选取的方案数也可以通过组合数算出来,也就是
(cntodd)
。
首先剩下两种颜色的数量不妨记为
y,z
,设
y<z
,并且必须要有
odd≥z−y
首先
z
要在某几个奇数中比
那么剩下的
y′
就和剩下的
z′
数量一样了,都是
y−odd−(z−y)2
那么剩下的
y
和
最后的最后,因为偶数段无论是两者谁开头都可以,所以还要再乘上一个
2cnt−odd
。
至此,问题就基本解决了。
时间复杂度
O(n)
空间复杂度
O(n)