题目描述
以以下规则,用红蓝绿三种颜色填充一个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)