前言
相对于一般的快速幂,矩阵快速幂仅仅是把他的底数和乘数换成了矩阵形式,而相应的乘法运算什么的也遵循矩阵的运算法则。矩阵快速幂主要是用于求一个很复杂的递推式的某一项问题。
一、构造矩阵
struct matrix {
int mat[15][15];//定义矩阵
}x,y;
matrix mul(matrix x,matrix y){//矩阵乘法
matrix tmp;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
tmp.mat [i][j]=0;
for(int k=0;k<len;k++){
tmp.mat [i][j]+=(x.mat [i][k]*y.mat [k][j])%mod;
}
tmp.mat [i][j]=tmp.mat[i][j]%mod;
}
}
return tmp;
}
二、矩阵快速幂
matrix matpow(matrix x,matrix y,int num){//矩阵快速幂
while(num){
if(num&1){
y=mul(y,x);
}
x=mul(x,x);
num=num>>1;
}
return y;
}
矩阵快速幂递推公式
矩阵快速幂的难点在关系矩阵的构造上,而构造关系矩阵也就两个基本套路,要么是递推式、要么是线性变化
下面列举常见的递推公式
斐波那契数列
F
i
F_i
Fi=
F
i
−
1
F_{i-1}
Fi−1+
F
i
−
2
F_{i-2}
Fi−2
递推公式-1
G
i
G_i
Gi=a*
G
i
−
1
G_{i-1}
Gi−1+b*
G
i
−
2
G_{i-2}
Gi−2
递推公式-2
G
i
G_i
Gi=a*
G
i
−
1
G_{i-1}
Gi−1+
i
2
i^2
i2