定义
- 对于两个矩阵 A(m*p),B(p*n),他们的乘积为 C,那么有:
-
Ci,j=∑k=1pAi,k+Bk,j
<script type="math/tex; mode=display" id="MathJax-Element-1"> C_{i,j}=\sum_{k=1}^{p} A_{i,k}+B_{k,j} </script>
- 看百度更清楚,点击进入百度百科界面
快速幂
应用
快速求斐波那契数列某一项
结论
- 可以弄一个 2*2 的矩阵
-
A=[0111]
<script type="math/tex; mode=display" id="MathJax-Element-2"> A= \begin{bmatrix} 0 & 1\\ 1 & 1 \end{bmatrix} </script>
- 那么会发现,斐波那契数列除前两个1外,第 n 项就是 An <script type="math/tex" id="MathJax-Element-3">A^n</script>,可以自己试试。
证明
- 可以归纳证明
程序
//Luogu-1962
#include <cstdio>
#define Ha 1000000007
typedef long long ll
struct matrix{ll a[2][2]
ll n
matrix multi(matrix x,matrix y){
matrix z={
0}
for (ll i=0
for (ll j=0
for (ll k=0
z.a[i][j]=(z.a[i][j]+(x.a[i][k]*y.a[k][j])%Ha)%Ha
return z
}
matrix ksm(matrix x,ll y){
matrix ret={
0}
ret.a[0][0]=ret.a[1][1]=1
for (
if (y&1) ret=multi(ret,x)
return ret
}
int main(){
A.a[0][0]=0,A.a[0][1]=A.a[1][0]=A.a[1][1]=1
scanf("%lld",&n)
printf("%lld\n",ksm(A,n-1).a[1][1])
}