乘
#include<bits/stdc++.h>
#define Honkai ios::sync_with_stdio(0);
#define StarRail cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
constexpr int maxn=110;
int n,m,p;
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
void multi(int a[][maxn],int b[][maxn]) {for (int k=1;k<=m;k++) for (int i=1;i<=n;i++) for (int j=1;j<=p;j++) c[i][j]+=a[i][k]*b[k][j];}
int main()
{
Honkai StarRail
cin >> n >> m;
for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) cin >> a[i][j];
cin >> p;
for (int i=1;i<=m;i++) for (int j=1;j<=p;j++) cin >> b[i][j];
multi(a,b);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=p;j++) cout << c[i][j] << " ";
cout << endl;
}
return 0;
}
快速幂
#include<bits/stdc++.h>
#define Honkai ios::sync_with_stdio(0);
#define StarRail cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
constexpr int maxn=110,p=1e9+7;
long long n,k;
long long a[maxn][maxn],c[maxn][maxn],ans[maxn][maxn];
void multi(long long a[][maxn],long long b[][maxn])
{
for (long long k=1;k<=n;k++) for (long long i=1;i<=n;i++) for (long long j=1;j<=n;j++) c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%p)%p;
memcpy(a,c,sizeof(c));memset(c,0,sizeof(c));
}
void ksm()
{
while (k)
{
if (k&1) multi(ans,a);
multi(a,a);
k>>=1;
}
}
int main()
{
Honkai StarRail
cin >> n >> k;
for (long long i=1;i<=n;i++)
{
for (long long j=1;j<=n;j++) cin >> a[i][j],a[i][j]%=p;
ans[i][i]=1;
}
ksm();
for (long long i=1;i<=n;i++)
{
for (long long j=1;j<=n;j++) cout << ans[i][j] << " ";
cout << endl;
}
return 0;
}