题目大意:
给一个n*n的矩阵,求它的 k 次方的矩阵。
(矩阵乘法的意义请百度,这里我只是想展示一个矩阵乘法的模板函数~~)
解题思路:
1、快速幂作为函数使用;
2、矩阵乘法也用函数表达(本题最想说的部分)
上代码:
#include<cstdio>
#define ll long long
const int p=1e9+7;
int n;
struct nod{ll a[110][110]; }a,c;
//a矩阵是输入,c矩阵是答案
ll m;
nod mul(nod x,nod y)
{//矩阵乘法的函数(类比高精度乘法,应该比较易懂)
nod z;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
z.a[i][j]=0;
for(int k=1;k<=n;k++)
{
z.a[i][j]=(z.a[i][j]+(x.a[i][k]*y.a[k][j])%p)%p;
}
}
}
return z;
}
void sqr(ll x)
{
while(x>0)
{
if(x%2>0) c=mul(c,a);//矩阵乘法的函数
a=mul(a,a);
x/=2;
}
}
int main()
{
scanf("%d %lld",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a.a[i][j]);
}
c.a[i][i]=1;//初始化 c数组
}
sqr(m);//矩阵跑快速幂 m次方运算
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",c.a[i][j]);
}printf("\n");
}
}