从定义可以看出$f$具备动态规划的特性,必定满足线性递推式,不难验证
$$f_n=2f_{n-1}-f_{n-2}+2f_{n-3}+f_{n-4}+f_{n-5}-f_{n-7}-f_{n-8}.$$
从而$f_n^k$是关于$f_{n-1},\ldots,f_{n-8},f_{n-1}^2,\ldots,f_{n-8}^2,\ldots,f_{n-1}^k,\ldots,f_{n-8}^k$的递推式。
直接用矩阵形式计算即得最终结果$777577686$。
注:因使用numpy作多维数组运算,以下代码为Python 3。
import numpy
n=10**14
mod=10**9
X=[1, 1, 1, 2, 6, 14, 28, 56]
T=[[[i==j==k < n%8 for k in range(8)] for j in range(8)] for i in range(8)]
M=numpy.array([[0, 1, 0, 0, 0, 0, 0, 0],
[ 0, 0, 1, 0, 0, 0, 0, 0],
[ 0, 0, 0, 1, 0, 0, 0, 0],
[ 0, 0, 0, 0, 1, 0, 0, 0],
[ 0, 0, 0, 0, 0, 1, 0, 0],
[ 0, 0, 0, 0, 0, 0, 1, 0],
[ 0, 0, 0, 0, 0, 0, 0, 1],
[-1, -1, 0, 1, 1, 2, -1, 2]], numpy.int64)
f=lambda A,B:numpy.remainder(numpy.tensordot(A, B, axes=(0,0)), mod)
g=lambda A:numpy.remainder(numpy.tensordot(A, A, axes=(1,0)), mod)
f3=lambda A,B:f(f(f(A,B),B),B)
h=lambda m,A,B,C: f3(numpy.remainder(f3(A,B)+C,mod),X) if m==1 else h(m//2, numpy.remainder(f3(A,B)+C,mod) if m%2==1 else A, g(B), numpy.remainder(f3(C,B)+C, mod))
print(f(f(f(T))) if n//8==0 else h(n//8, T, g(g(g(M))), [[[i==j==k for k in range(8)] for j in range(8)] for i in range(8)]))
|