題目描述
以以下規則,用紅藍綠三種顏色填充一個2×n 的表格。
- 相鄰的格子顏色不能相同。有公共邊的格子就被視爲是相鄰的了。
- 每個2×2 的格子內,每種顏色都至少要出現一次。
答案對109+7 取模
n≤106
分析
首先這個約束是非常緊的。
考慮將它取反,也就是說求出每一列沒出現的顏色,排成一行,對應的每種顏色ci 的數量變成n−cntci 。
那麼兩行的信息,就可以通過這一列反色的信息,以及兩行開頭一列的排列順序確定下來。
對應的,因爲2×2 方格內不能有缺失,所以反串也不能有連續相同的顏色。
那麼我們先填充開頭的顏色,記它的數量爲x ,於是整個序列就會被劃分成若干段空白,當最後一位被選了,空白段數就是x−1 ,否則就是x ,記它爲cnt 。
其中有一部分是奇數的,一部分是偶數的。
枚舉一下有多少段是奇數的,記爲odd ,那麼偶數段數就可以算出來,是cnt−odd 。而且選取的方案數也可以通過組合數算出來,也就是(cntodd) 。
首先剩下兩種顏色的數量不妨記爲y,z ,設y<z ,並且必須要有odd≥z−y
首先z 要在某幾個奇數中比y 多出現一次,先排除掉,然後多餘的odd−(z−y) 需要兩兩分配,也就是總共要從odd 箇中選出odd−(z−y)2 個y 多的,共貢獻(oddodd−(z−y)2)
那麼剩下的y′ 就和剩下的z′ 數量一樣了,都是y−odd−(z−y)2
那麼剩下的y 和z 必須成對出現,每個段中至少要有一對yz ,而odd 不一定要有,cnt−odd 一定要有,用擋板問題算出貢獻爲⎛⎝y−odd−(z−y)2+odd−1cnt−1⎞⎠ 。
最後的最後,因爲偶數段無論是兩者誰開頭都可以,所以還要再乘上一個2cnt−odd 。
至此,問題就基本解決了。
時間複雜度O(n)
空間複雜度O(n)