例题:洛谷P3390 【模板】矩阵快速幂
传送门:https://www.luogu.org/problemnew/show/P3390
题解:直接矩阵乘法即可。
矩阵的快速幂我们可以类比一下一个数的快速幂求法;
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
const int MOD=1000000007;//此例题的模数
struct matrix
{
LL a[110][110];
}p,ans,pp;
LL n,m,k;
matrix multiplication(matrix x,matrix y)//矩阵乘法函数
{
matrix sum;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum.a[i][j]=0;//因为要累加,所以要先清零,不清零会WA
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
sum.a[i][j]+=(x.a[i][k]*y.a[k][j])%MOD;//sum[x][y]=∑(k=1,k<=n)x.a[i][k]+y.a[k][j]
sum.a[i][j]%=MOD;
}
}
}
return sum;
}
matrix quick_pow(LL x)//x为一个数,这个函数就像普通数的快速幂一样,只是要乘起来的变成了一个矩阵
{
for(int i=1;i<=n;i++)
{
ans.a[i][i]=1;//构造单位矩阵,一个矩阵乘上单位矩阵结果还是此矩阵
}
while(x)
{
if(x%2==1)
{
ans=multiplication(ans,p);//可以类比普通数的快速幂
}
p=multiplication(p,p);
x/=2;
}
return ans;
}
int main()
{
scanf("%lld%lld",&n,&k);//一个n*n的矩阵,求此矩阵的k次方
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%lld",&p.a[i][j]);
}
}
pp=quick_pow(k);//快速幂
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%lld ",pp.a[i][j]);
}
cout<<endl;
}
return 0;
}