参考博客1
问题: 对于
fi=A⋅fi−1+B⋅fi−2+C,(i≥3),已知
f1,f2,求解
fn(n≤1018),由于结果可能过大,答案对
109+7取模
显然这个问题没法在
O(n)复杂度内解决,所以我们另寻他法。
系数矩阵及推导:
我们从最熟悉的
Fibonacci入手
f1=1,f2=1,fi=fi−1+fi−2,(i≥3)
将
Fibonacci通式写成上面式子的模样,得到
fi=1⋅fi−1+1⋅fi−2
初始矩阵为:
[fi−1fi−2]
想要通过初始矩阵得到结果矩阵:
[fifi−1]
那么初始矩阵必然左乘一个
2×2的系数矩阵:
[k1 k2k3 k4]
这样得到的矩阵为:
[k1 k2k3 k4][fi−1fi−2]=[k1fi−1+k2fi−2k3fi−1+k4fi−2]
由我们写成标准形式的
Fibonacci式得到:
k1=1,k2=1
k3fi−1+k4fi−1=fi−2,故
k3=1,k4=0
Fibonacci通项的系数矩阵即:
[1 11 0]
回到我们的问题所给通项:
fi=A⋅fi−1+B⋅fi−2+C,(i≥3)
初始矩阵:
⎣⎡fi−1fi−2C⎦⎤
想要通过初始矩阵得到结果矩阵:
⎣⎡fifi−1C⎦⎤
那么初始矩阵必然左乘一个
3×3的系数矩阵:
⎣⎡k1 k2 k3k4 k5 k6k7 k8 k9⎦⎤
这样得到的矩阵为:
⎣⎡k1 k2 k3k4 k5 k6k7 k8 k9⎦⎤⎣⎡fi−1fi−2C⎦⎤=⎣⎡k1fi−1+k2fi−2+k3Ck4fi−1+k5fi−2+k6Ck7fi−1+k8fi−2+k9C⎦⎤
由问题给定的通项:
fi=A⋅fi−1+B⋅fi−2+C,(i≥3)
fi=k1fi−1+k2fi−2+k3C=A⋅fi−1+B⋅fi−2+C
故
k1=A,k2=B,k3=1
fi−1=k4fi−1+k5fi−2+k6C
故
k4=1,k2=k3=0
C=k7fi−1+k8fi−2+k9C
故
k7=k8=0,k9=1
系数矩阵为:
⎣⎡A B 11 0 00 0 1⎦⎤
思考:
fi=ci−fi−1的矩阵形式
解法:
初始矩阵为:
[fi−1ci−1]
这里需要上述标准式不同的是,你要想到第
i−1项中
c的指数为多少,为
i−1,故初始矩阵和标准式不完全相同,同时我们求的是
fi,所以其不能加上负号,负号都是丢到系数上的。
想要通过初始矩阵得到结果矩阵:
[fici]
那么初始矩阵必然左乘一个
2×2的系数矩阵:
[k1 k2k3 k4]
这样得到的矩阵为:
[k1 k2k3 k4][fi−1ci−1]=[k1fi−1+k2ci−1k3fi−1+k4ci−1]
由
k1fi−1+k2ci−1=fi,故
k1=−1,k2=c
由
k3fi−1+k4ci−1=ci,故
k3=0,k4=c
系数矩阵:
[−1 c 0 c]
矩阵快速幂:
设
Fn为所求的第
n项的矩阵形式,
A为系数矩阵:
那么
Fn=AFn−1=A2Fn−2=...=An−1F1
An−1这个系数部分可以直接通过快速幂计算得到,最后再乘上初始矩阵即可。
注:初始矩阵一般都是给定的数值。
最后我们直接取出
Fn矩阵中的对应的
fn即可。
例题自取