快速幂讲解,百度百科讲的非常不错:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E5%B9%82/5500243?fr=aladdin
矩阵快速幂,顾名思义就是把快速幂的计算方法转换到矩阵当中,加速底数是矩阵形式的n次幂计算。
在矩阵当中,最重要的是矩阵的乘法,由于没有矩阵运算模块,所以我们要自己写。此处只讲述时间复杂度为O(N3)的方法,若同学有兴趣,请自行了解复杂度为O(N2.7)的算法。
为了便于理解,请先深入理解矩阵乘法与线性方程的关系:
https://blog.csdn.net/FnqTyr45/article/details/90090970
根据矩阵乘法的计算公式得出:
typedef long long int ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
mat matrix_multi(mat& a,mat& b)//矩阵运算模块
{
//n为矩阵a的行数,m为矩阵b的列数
int n=a.size(),m=b[0].size();
mat c(n,vec(m,0));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
for(int k=0;k<a[i].size();k++)
c[i][j]=(c[i][j]+a[i][k]*b[k][j]);
return c;
}
将矩阵的乘法代入快速幂模板中得出:
mat pow_mat