0237 棋盘巡游
* * * *
拉格朗日计划
* * * *
棋盘巡游

记$T(n)$是在$4\times n$的棋盘上、从左上角开始、在左下角结束,每次可以向上下左右四个方向之一移动一格且每一格都经过恰好一次的路线总数。

下图是一种满足上述要求的巡游方式:



已知$T(10)=2329$。求$T(10^{12})$模$10^8$的余数。

本题难度:



解答

OEIS A181688中的公式可知,$T(1)=T(2)=1$,$T(3)=4$,$T(4)=8$,对$n\ge 5$有 $$T(n)=2T(n-1)+2T(n-2)-2T(n-3)+T(n-4)$$ 这一递推式也可写作 $$\begin{pmatrix}T(n) \\ T(n-1) \\ T(n-2) \\ T(n-3)\end{pmatrix}=\begin{pmatrix} 2 & 2 & -2 & 1\\ 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{pmatrix}\begin{pmatrix}T(n-1) \\ T(n-2) \\ T(n-3) \\ T(n-4) \end{pmatrix}$$ 从而需要计算 $$\begin{pmatrix} 2 & 2 & -2 & 1\\ 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{pmatrix}^{10^{12}-4}\begin{pmatrix}8 \\ 4 \\ 1 \\ 1 \end{pmatrix}$$ 的第一个分量,使用快速幂的技巧计算即得结果$15836928$。

n=10**12-4
m=10**8

f=lambda A,B:[[sum(A[i][k]*B[k][j] for k in range(4))%m for j in range(len(B[0]))] for i in range(4)]

A=[[2,2,-2,1],[1,0,0,0],[0,1,0,0],[0,0,1,0]]
x=[[8],[4],[1],[1]]

while n:
    if n%2==1:
        x=f(A,x)
    A=f(A,A)
    n>>=1

print x[0][0]