矩阵快速幂
矩阵快速幂和乘法快速幂一样,不过不同的是,*这里变成了mul,同时还要知道矩阵乘法的性质:
1、矩阵乘法满足结合律,不满足交换律,即AB不等于BA,因为矩阵乘为A(mn)B(ns)=C(ms),所以必定是有顺序的
2、新矩阵第i行第j列的数等于A矩阵第i行和B矩阵第j列逐一相乘的和,代码中为
tp.map[i][j]+=a.map[i][k]*b.map[k][j](k是从1到n)
#include<cstdio>
#define ll long long
using namespace std;
ll n,k;
int mod=(1e+9)+7;
struct node
{
ll map[201][201];
}a,ans;
node mul(node a,node b)
{
node tp;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
tp.map[i][j]=0;//刚开始一定要将结构体里的数组清空,否则会出错
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
tp.map[i][j]=(tp.map[i][j]+(a.map[i][k]*b.map[k][j])%mod)%mod;
return tp;
}
void quick(node a,ll p)
{
for(int i=1;i<=n;++i)
ans.map[i][i]=1;
while(p)
{
if(p&1)
ans=mul(ans,a);
a=mul(a,a);
p>>=1;
}
}
int main()
{
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%lld",&a.map[i][j]);
quick(a,k);
for(int i=1;i<=n;++i,printf("\n"))
for(int j=1;j<=n;++j)
printf("%lld ",ans.map[i][j]%mod);//别忘了最后结果在%一次
}