矩阵快速幂
清北学堂听了李昊老师讲的矩阵快速幂,觉得挺有收获,整理一下下~
主要用到的知识就是矩阵乘法和重载运算符~
首先说一下矩阵乘法的定义:
那么我们就可以看到,这个矩阵乘法不是像一般的代数式一样相乘,而是有自己的规则:
答案矩阵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;
}