矩阵的快速幂
问题:求m*m矩阵的等比前n项和,即A+A2+A3+...+A^n
struct node {
int mat[15][15];//定义矩阵
}x,y;
分析:矩阵乘法中关于等比矩阵的求法:
| A E|
| 0 E| E为单位矩阵。
由等比矩阵的性质:
* n
| A , E| |A^n , 1+A^1+A^2+....+A^(n-1)|
| 0 , E| = |0 , E |
所以我们在求此类问题时:
1.矩阵A扩大4倍 | A E|
| 0 E|
2.求矩阵的n+1次方幂 n
| A , E|
| 0 , E|
3.分离矩阵: 得:1+A^1+A^2+....+A^n
4.矩阵减1 A^1+A^2+....+A^n
二:求矩阵幂:
解法1.矩阵乘法:
node mul(node x,node y){//矩阵乘法
node 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;
}
解法2:快速幂
首先;理解快速幂:
举个例子,在求 x^19时,我们可以拆分成 x16、x2 和 x的乘积。我们观察19的二进制数(10011),发现二进制第 i 位上的值为 1 ,在乘
积中就要有 x 的 2^i 的一项。据此我们可以利用遍历二进制数的每一位快速求出 X^N。 代码如下:
ll QuickPow(int x,int n)
{
int tmp = x;
int res=1;
while(n)
{
if(n&1)
res=(res*tmp)%mod;
tmp = (tmp*tmp)%mod;
n>>=1;
}
return res;
}
所以矩阵的快速幂代码为:
node matpow(node x,node y,int num){//矩阵快速幂
while(num){
if(num&1){
y=mul(y,x);
}
x=mul(x,x);
num=num>>1;
}
return y;
}

浙公网安备 33010602011771号