dp[i][j]dp[i][j]22ii 列のグリッドを白色と黒色のグリッドで塗りつぶしたとき、黒色のマスが隣接しない塗り方の数の内、一番右の列の状態がjのものの数とする. ただし、

  • j=0j=0 のとき上下のマスが白色
  • j=1j=1のとき、上のマスが黒色、下のマスが白色
  • j=2j=2のとき、上のマスが白色、下のマスが黒色 の状態とする。 このとき、

dp[1][0]=dp[1][1]=dp[1][2]=1dp[1][0]=dp[1][1]=dp[1][2]=1

dp[i][0]=dp[i1][0]+dp[i1][1]+dp[i1][2]dp[i][0]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2]

dp[i][1]=dp[i1][0]+dp[i1][2]dp[i][1]=dp[i-1][0]+dp[i-1][2]

dp[i][2]=dp[i1][0]+dp[i1][1]dp[i][2]=dp[i-1][0]+dp[i-1][1]

が成り立つ。 これを行列累乗などを用いて高速化することで、計算量は O(logn)O(logn) となる。