題目大意
有一個2∗M 的綵帶,綵帶的每個格子都可以染上紅色,藍色,綠色中的一種顏色,一個綵帶被稱爲合法的,當且僅當
1. 相鄰兩個格子的顏色不同
2. 對於每個2*2的小矩陣三種顏色都要出現
3. 整個綵帶上有R 個紅色格子,B 個藍色格子,G 個綠色格子。
給定M,R,B,G ,求可能的合法綵帶數。對109+7 取模。
數據範圍
R+B+G=2∗M,0≤M≤1000000
題解
我們不妨設Ai 表示第i 列沒有出現的顏色,且滿足Ai≠Ai−1 。那麼很顯然地,假如我們確定了第一列的狀態,以及所有的Ai ,我們就唯一確定了這條綵帶。因此,我們把原問題轉化爲給一個長度爲M 的序列染上三種顏色,相鄰格子顏色不能相同,並且每種顏色有數量限制。
考慮枚舉A1 ,設X 爲開頭顏色的數量,Y,Z 爲剩下兩種顏色的數量。假如所有開頭顏色確定了其在序列中放的位置,那麼剩下的格子就要被分爲X 段或X−1 段,X−1 段是因爲開頭顏色可能可以放在結尾。設G 爲最終分成的段數。對於每一段,我們分其長度爲偶數或奇數兩種情況考慮。
我們可以枚舉最終有e 段偶數,對於每段偶數段,必然是YZYZYZ 或ZYZYZY 的形式,因爲需要保證相鄰不相同。因爲每一段都不能是空的,因此我們可以先給每段偶數段都先加入一個Y,Z ,那麼這兩種顏色剩下的數量就是Y−e,Z−e 。
對於奇數段的,假如我們確定了開頭是Y 還是Z ,那麼接下來還是類似於偶數段,只是形式已經確定了。假設最終有oy 段奇數段開頭爲Y ,oz 段爲Z ,那麼我們可以列出方程組
oy+oz=G−e
y−oy=z−oz
對於第二條等式,是因爲你除了開頭以外總是要保證Y,Z 相鄰,那麼數量自然相同。那麼我們就可以解出oy,oz 了。
接下來考慮e 段爲偶數的貢獻就是
(Ge)∗(G−eoy)∗2e∗(y−oy−e+g−1g−1)
第一條式子就是從G 段中選出e 段偶數段,接下來就是從G−e 段奇數段中分配oy 段給Y ,然後對於每段偶數段,都可以選擇Y 開頭或Z 開頭,因此是2e ,最後一項是統計還剩下y−oy−e 個Y ,要把他們分配到g 段中,注意每往一段中加入一個Y ,必然要伴隨一個Z ,因此只需要考慮Y 的分配即可。並且因爲我們一開始已經往每一段中加入了一些Y 和Z ,所以最終分配時允許某一段分配爲空,這就是一個擋板問題。
最終時間複雜度就是O(N) ,空間複雜度也是O(N) 。