矩阵快速幂

清北学堂听了李昊老师讲的矩阵快速幂,觉得挺有收获,整理一下下~

主要用到的知识就是矩阵乘法和重载运算符~

首先说一下矩阵乘法的定义:

那么我们就可以看到,这个矩阵乘法不是像一般的代数式一样相乘,而是有自己的规则:

答案矩阵C第i行第j列的值为: A矩阵的第i行每个元素乘上对应B矩阵第j列的每个元素的和,也就是上面那个公式(前提要保证A矩阵的列数等于B矩阵的行数,否则答案为0)

那么怎么办呢??

我们可以自己来重编一下乘法运算,使其变为矩阵的乘法运算,这就是重载运算符,很好理解吧!(当然你也可以写一个函数来算矩阵乘法)

先说一下重载运算符的代码吧:

下面给出自定义函数的代码:

#include<iostream>
#include<cstdio>
using namespace std;
int mod=1000000007,n,k;       //膜数mod根据具体情况而定
struct matrix{                          //定义结构体
long long data[101][101];       //用来存放矩阵元素
matrix()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
data[i][j]=0;                             //初始化
}
};
matrix a,c,e;                           //创建多组结构体
matrix cheng(matrix a,matrix b)        //核心代码,自定义矩阵乘法规则
{
matrix c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int m=1;m<=n;m++)
c.data[i][j]+=a.data[i][m]*b.data[m][j]%mod;      //根据矩阵乘法定义进行运算,卡定义呗,各位大佬应该都会
return c;
}
matrix quick_pow(matrix x,int y)                     //快速幂,主要前面是matrix,被卡了好几次才发现是这个问题

matrix ans=e;
while(y)
{
if(y&1) ans=cheng(ans,x);                               //自定义运算
x=cheng(x,x); 
y>>=1;
}
return ans;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
e.data[i][i]=1;                                                     //单位矩阵,不能没有!!!相等于快速幂中的ans=1
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a.data[i][j];
matrix ans=quick_pow(a,k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<ans.data[i][j]<<" ";
cout<<endl;
}
return 0;
}

 

posted @ 2019-04-08 21:36  暗い之殇  阅读(216)  评论(0编辑  收藏  举报