题目描述
给定 n n n 的矩阵 A A A,求 A k A^k Ak
矩阵乘法快速幂
#include<iostream>
#include<cstdio>
using namespace std;
long long n, k;
long long a[200][200];
long long ans[200][200];
long long p=1000000007;
void multi()
{
long long c[200][200];
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
c[i][j]=0;
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
for(long long k=1; k<=n; k++)
c[i][j]=(c[i][j]+a[i][k]*ans[k][j])%p;
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
ans[i][j]=c[i][j];
}
void multi1()
{
long long c[200][200];
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
c[i][j]=0;
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
for(long long k=1; k<=n; k++)
c[i][j]=(c[i][j]+a[i][k]*a[k][j])%p;
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
a[i][j]=c[i][j];
}
void ksm(long long k)
{
for(long long i=1; i<=n; i++)
ans[i][i]=1;
while(k!=0)
{
if(k&1)
multi();
multi1();
k>>=1;
}
}
int main()
{
scanf("%lld%lld", &n, &k);
for(long long i=1; i<=n; i++)
for(long long j=1; j<=n; j++)
scanf("%lld", &a[i][j]);
ksm(k);
for(long long i=1; i<=n; i++)
{
for(long long j=1; j<=n; j++)
printf("%lld ", ans[i][j]);
printf("\n");
}
return 0;
}