关于矩阵快速幂の简单粗暴の理解
今天做题遇到了矩阵快速幂,找了半天博客都没看懂
最后还是看代码自己悟。所以这里我就把自己的理解
写出来,有不对的欢迎指正。
真正理解后感觉也就没几句话就讲完了,首先我们看
一下数的快速幂
ll Mypow(ll a,ll b)
{
ll re = 1;
while(b)
{
if(b&1)re *= a;
a *= a;
b >>= 1;
}
return re;
}
数的快速幂我想大家都理解(如果不理解请自行百度),而矩阵快速幂和数类似,我们可以比较来理解。
先看看矩阵快速幂:
#define n 2;//矩阵大小
struct Matrix // 定义矩阵
{
int a[n][n];
Matrix()
{
memset(a,0,sizeof(a));
}
};
Matrix mul(Matrix a,Matrix b)//矩阵乘法
{
Matrix ans;
for(int i=0 ; i<n ; i++)
{
for(int k=0 ; k<n ; k++)
{
if(a.a[i][k])
for(int j=0 ; j<n ; j++)
{
ans.a[i][j]+=a.a[i][k]*b.a[k][j];
}
}
}
return ans;
}
Matrix Mypow(Matrix a,int N)
{
Matrix re;
for(int i=0 ; i<n ; i++)re.a[i][i] = 1;
while(N)
{
if(N&1)re = mul(re,a);
a = mul(a,a);
N >>= 1;
}
return re;
}
很明显,除了矩阵乘法,矩阵定义与普通的数不一样以外Mypow中的结构基本一样。只是一点,数的快速幂中最开始是1,而矩阵中是单位矩阵。
相关题链接:http://blog.csdn.net/vocaloid01/article/details/78155053