参考博客1
问题: 对于 f i = A ⋅ f i − 1 + B ⋅ f i − 2 + C , ( i ≥ 3 ) f_i=A\cdot f_{i-1}+B\cdot f_{i-2}+C,(i\geq3) fi=A⋅fi−1+B⋅fi−2+C,(i≥3),已知 f 1 , f 2 f_1,f_2 f1,f2,求解 f n ( n ≤ 1 0 18 ) f_n(n\leq10^{18}) fn(n≤1018),由于结果可能过大,答案对 1 0 9 + 7 10^9+7 109+7取模
显然这个问题没法在 O ( n ) O(n) O(n)复杂度内解决,所以我们另寻他法。
系数矩阵及推导:
我们从最熟悉的 F i b o n a c c i Fibonacci Fibonacci入手
f 1 = 1 , f 2 = 1 , f i = f i − 1 + f i − 2 , ( i ≥ 3 ) f_1=1,f_2=1,f_i=f_{i-1}+f_{i-2},(i\geq3) f1=1,f2=1,fi=fi−1+fi−2,(i≥3)
将 F i b o n a c c i Fibonacci Fibonacci通式写成上面式子的模样,得到 f i = 1 ⋅ f i − 1 + 1 ⋅ f i − 2 f_i=1 \cdot f_{i-1}+1\cdot f_{i-2} fi=1⋅fi−1+1⋅fi−2
初始矩阵为:
[ f i − 1 f i − 2 ] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \end{matrix} \right] [fi−1fi−2]
想要通过初始矩阵得到结果矩阵:
[ f i f i − 1 ] \left[ \begin{matrix} f_{i} \\ f_{i-1} \end{matrix} \right] [fifi−1]
那么初始矩阵必然左乘一个 2 × 2 2\times 2 2×2的系数矩阵:
[ k 1 k 2 k 3 k 4 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] [k1 k2k3 k4]
这样得到的矩阵为:
[ k 1 k 2 k 3 k 4 ] [ f i − 1 f i − 2 ] = [ k 1 f i − 1 + k 2 f i − 2 k 3 f i − 1 + k 4 f i − 2 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \end{matrix} \right]= \left[ \begin{matrix} k_1f_{i-1}+k_2f_{i-2} \\ k_3f_{i-1}+k4f_{i-2} \end{matrix} \right] [k1 k2k3 k4][fi−1fi−2]=[k1fi−1+k2fi−2k3fi−1+k4fi−2]
由我们写成标准形式的 F i b o n a c c i Fibonacci Fibonacci式得到:
k 1 = 1 , k 2 = 1 k_1=1,k_2=1 k1=1,k2=1
k 3 f i − 1 + k 4 f i − 1 = f i − 2 k_3f_{i-1}+k4f_{i-1} =f_{i-2} k3fi−1+k4fi−1=fi−2,故 k 3 = 1 , k 4 = 0 k_3=1,k_4=0 k3=1,k4=0
F i b o n a c c i Fibonacci Fibonacci通项的系数矩阵即:
[ 1 1 1 0 ] \left[ \begin{matrix} 1 \ \ \ 1 \\ 1 \ \ \ 0 \end{matrix} \right] [1 11 0]
回到我们的问题所给通项: f i = A ⋅ f i − 1 + B ⋅ f i − 2 + C , ( i ≥ 3 ) f_i=A\cdot f_{i-1}+B\cdot f_{i-2}+C,(i\geq3) fi=A⋅fi−1+B⋅fi−2+C,(i≥3)
初始矩阵:
[ f i − 1 f i − 2 C ] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \\ C\\ \end{matrix} \right] ⎣⎡fi−1fi−2C⎦⎤
想要通过初始矩阵得到结果矩阵:
[ f i f i − 1 C ] \left[ \begin{matrix} f_{i} \\ f_{i-1} \\ C \end{matrix} \right] ⎣⎡fifi−1C⎦⎤
那么初始矩阵必然左乘一个 3 × 3 3\times 3 3×3的系数矩阵:
[ k 1 k 2 k 3 k 4 k 5 k 6 k 7 k 8 k 9 ] \left[ \begin{matrix} k_1 \ k_2 \ k_3\\ k_4 \ k_5 \ k_6\\ k_7 \ k_8 \ k_9 \end{matrix} \right] ⎣⎡k1 k2 k3k4 k5 k6k7 k8 k9⎦⎤
这样得到的矩阵为:
[ k 1 k 2 k 3 k 4 k 5 k 6 k 7 k 8 k 9 ] [ f i − 1 f i − 2 C ] = [ k 1 f i − 1 + k 2 f i − 2 + k 3 C k 4 f i − 1 + k 5 f i − 2 + k 6 C k 7 f i − 1 + k 8 f i − 2 + k 9 C ] \left[ \begin{matrix} k_1 \ k_2 \ k_3\\ k_4 \ k_5 \ k_6\\ k_7 \ k_8 \ k_9 \end{matrix} \right] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \\ C\\ \end{matrix} \right]= \left[ \begin{matrix} k_1f_{i-1}+k_2f_{i-2}+k_3C \\ k_4f_{i-1}+k_5f_{i-2}+k_6C\\ k_7f_{i-1}+k_8f_{i-2}+k_9C \end{matrix} \right] ⎣⎡k1 k2 k3k4 k5 k6k7 k8 k9⎦⎤⎣⎡fi−1fi−2C⎦⎤=⎣⎡k1fi−1+k2fi−2+k3Ck4fi−1+k5fi−2+k6Ck7fi−1+k8fi−2+k9C⎦⎤
由问题给定的通项: f i = A ⋅ f i − 1 + B ⋅ f i − 2 + C , ( i ≥ 3 ) f_i=A\cdot f_{i-1}+B\cdot f_{i-2}+C,(i\geq3) fi=A⋅fi−1+B⋅fi−2+C,(i≥3)
f i = k 1 f i − 1 + k 2 f i − 2 + k 3 C = A ⋅ f i − 1 + B ⋅ f i − 2 + C f_i = k_1f_{i-1}+k_2f_{i-2}+k_3C = A\cdot f_{i-1}+B\cdot f_{i-2}+C fi=k1fi−1+k2fi−2+k3C=A⋅fi−1+B⋅fi−2+C
故 k 1 = A , k 2 = B , k 3 = 1 k_1=A,k_2=B,k_3=1 k1=A,k2=B,k3=1
f i − 1 = k 4 f i − 1 + k 5 f i − 2 + k 6 C f_i-1=k_4f_{i-1}+k_5f_{i-2}+k_6C fi−1=k4fi−1+k5fi−2+k6C
故 k 4 = 1 , k 2 = k 3 = 0 k_4=1,k_2=k_3=0 k4=1,k2=k3=0
C = k 7 f i − 1 + k 8 f i − 2 + k 9 C C = k_7f_{i-1}+k_8f_{i-2}+k_9C C=k7fi−1+k8fi−2+k9C
故 k 7 = k 8 = 0 , k 9 = 1 k_7=k_8=0,k_9=1 k7=k8=0,k9=1
系数矩阵为:
[ A B 1 1 0 0 0 0 1 ] \left[ \begin{matrix} A\ B\ 1\\ 1\ 0\ 0\\ 0\ 0\ 1\\ \end{matrix} \right] ⎣⎡A B 11 0 00 0 1⎦⎤
思考: f i = c i − f i − 1 f_i=c^i-f_{i-1} fi=ci−fi−1的矩阵形式
解法:
初始矩阵为:
[ f i − 1 c i − 1 ] \left[ \begin{matrix} f_{i-1} \\ c^{i-1} \end{matrix} \right] [fi−1ci−1]
这里需要上述标准式不同的是,你要想到第 i − 1 i-1 i−1项中 c c c的指数为多少,为 i − 1 i-1 i−1,故初始矩阵和标准式不完全相同,同时我们求的是 f i f_i fi,所以其不能加上负号,负号都是丢到系数上的。
想要通过初始矩阵得到结果矩阵:
[ f i c i ] \left[ \begin{matrix} f_{i} \\ c^{i} \end{matrix} \right] [fici]
那么初始矩阵必然左乘一个 2 × 2 2\times 2 2×2的系数矩阵:
[ k 1 k 2 k 3 k 4 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] [k1 k2k3 k4]
这样得到的矩阵为:
[ k 1 k 2 k 3 k 4 ] [ f i − 1 c i − 1 ] = [ k 1 f i − 1 + k 2 c i − 1 k 3 f i − 1 + k 4 c i − 1 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] \left[ \begin{matrix} f_{i-1} \\ c^{i-1} \end{matrix} \right]= \left[ \begin{matrix} k_1f_{i-1}+k_2c^{i-1} \\ k_3f_{i-1}+k_4c^{i-1} \end{matrix} \right] [k1 k2k3 k4][fi−1ci−1]=[k1fi−1+k2ci−1k3fi−1+k4ci−1]
由 k 1 f i − 1 + k 2 c i − 1 = f i k_1f_{i-1}+k_2c^{i-1} =f_i k1fi−1+k2ci−1=fi,故 k 1 = − 1 , k 2 = c k_1=-1,k_2=c k1=−1,k2=c
由 k 3 f i − 1 + k 4 c i − 1 = c i k_3f_{i-1}+k_4c^{i-1} = c^i k3fi−1+k4ci−1=ci,故 k 3 = 0 , k 4 = c k_3=0,k_4=c k3=0,k4=c
系数矩阵:
[ − 1 c 0 c ] \left[ \begin{matrix} -1 \ c \\ \ 0 \ \ c \end{matrix} \right] [−1 c 0 c]
矩阵快速幂:
设 F n F_n Fn为所求的第 n n n项的矩阵形式, A A A为系数矩阵:
那么 F n = A F n − 1 = A 2 F n − 2 = . . . = A n − 1 F 1 F_n=AF_{n-1}=A^2F_{n-2}=...=A^{n-1}F_1 Fn=AFn−1=A2Fn−2=...=An−1F1
A n − 1 A^{n-1} An−1这个系数部分可以直接通过快速幂计算得到,最后再乘上初始矩阵即可。
注:初始矩阵一般都是给定的数值。
最后我们直接取出 F n F_n Fn矩阵中的对应的 f n f_n fn即可。
例题自取