Blocks(POJ No.3734)

Blocks(POJ No.3734)

给定 N N 个方块排成一列。现在要用红、蓝、绿、黄四种颜色的油漆给这些方块染色。求染成红色的方块和染成绿色的方块的个数同时为偶数的染色方案的个数,输出对10007取余后的答案。
( 1 N 1 0 9 ) (1\leq N \leq 10^{9})

输入

N = 1
N = 2

输出

2
6

题解

让我们试着从左边开始依次染色。设染到第 i i 个方块为止,红绿都是偶数的方案数为 a i a_i ,红绿恰有一个是偶数的方案数为 b i b_i ,红绿都是奇数的方案数为 c i c_i 。这样,染到第 i + 1 i+1 个方块为止,红绿都是偶数的方案数有如下两种可能

  • 到第 i i 个方块为止红绿都是偶数,并且第 i + 1 i+1 个方块染成了蓝色或者黄色
  • 到第 i i 个方块为止红绿恰有一个是奇数,并且第 i + 1 i+1 个方块染成了奇数个对应的那种颜色,因此有如下递推式
    a i + 1 = 2 × a i + b i a_{i+1}=2 \times a_i+b_i

同样地,有
b i + 1 = 2 × a i + 2 × b i + 2 × c i b_{i+1}=2 \times a_i+2 \times b_i+2 \times c_i
c i + 1 = b i + 2 × c i c_{i+1}=b_i+2 \times c_i

a i , b i , c i a_i,b_i,c_i 的递推式用矩阵表示如下

[ a i + 1 b i + 1 c i + 1 ] = [ 2 1 0 2 2 2 0 1 2 ] [ a i b i c i ] \left[ \begin{matrix} a_{i+1} \\ b_{i+1} \\ c_{i+1} \end{matrix} \right] = \left[ \begin{matrix} 2 & 1 & 0 \\ 2 & 2 & 2 \\ 0 & 1 & 2 \end{matrix} \right] \left[ \begin{matrix} a_i \\ b_i \\ c_i \end{matrix} \right]
因此就有

[ a i b i c i ] = [ 2 1 0 2 2 2 0 1 2 ] i [ a 0 b 0 c 0 ] = [ 2 1 0 2 2 2 0 1 2 ] i [ 1 0 0 ] \left[ \begin{matrix} a_{i} \\ b_{i} \\ c_{i} \end{matrix} \right] = \left[ \begin{matrix} 2 & 1 & 0 \\ 2 & 2 & 2 \\ 0 & 1 & 2 \end{matrix} \right]^i \left[ \begin{matrix} a_0 \\ b_0 \\ c_0 \end{matrix} \right] = \left[ \begin{matrix} 2 & 1 & 0 \\ 2 & 2 & 2 \\ 0 & 1 & 2 \end{matrix} \right] ^{i} \left[ \begin{matrix} 1 \\ 0 \\ 0 \end{matrix} \right]

这样,用矩阵快速幂就可以求出这个问题的答案了。

发布了163 篇原创文章 · 获赞 54 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42856843/article/details/102178816