矩阵乘&矩阵快速幂

#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;
}
posted @ 2026-06-04 21:54  msjing  阅读(12)  评论(0)    收藏  举报