矩阵快速幂
在讲矩阵快速幂之前,要说清楚矩阵乘法是什么。
矩阵乘法,用来干什么,我这个小蒟蒻并不知道。
但是,有大佬对于他的作用可能有着自己的理解
我这里找的题目是洛谷3390 矩阵快速幂的模板
方法和整数的快速幂是一样的
自己重载一下乘号即可
顺带推荐一个大佬对于矩阵快速幂的理解(%%%songyuchen大佬)
%%%大佬
已经有大佬对于矩阵乘法的方法的讲解了,我就不再多说
直接贴一下矩阵快速幂的代码
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAX 101
#define MOD (1000000007)
long long n,k;
struct yl//矩阵
{
int n;//大小
long long g[MAX][MAX];
};
yl operator*(yl a,yl b)//定义乘法
{
int n=a.n;
yl cool;
memset(cool.g,0,sizeof(cool.g));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
cool.g[i][j]=(cool.g[i][j]+1ll*a.g[i][k]*b.g[k][j]%MOD)%MOD;
cool.n=n;
return cool;
}
void write(yl a)
{
int n=a.n;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
cout<<a.g[i][j]<<' ';
cout<<endl;
}
}
yl Pow(yl a,long long b)//a的b次方
{
if(b==1)return a;
yl s=Pow(a,b/2);
s.n=a.n;
s=s*s;
if(b&1)s=s*a;
return s;
}
int main()
{
cin>>n>>k;
yl Six;
Six.n=n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin>>Six.g[i][j];
write(Pow(Six,k));
return 0;
}