矩阵乘法 矩阵快速幂

矩阵乘法

#include<bits/stdc++.h>
using namespace std;
int a[110][110],b[110][110],c[110][110];
int n,m,k;
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			cin>>a[i][j];
		} 
	}
	cin>>m;
	for(int i=1;i<=k;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>b[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int r=1;r<=k;r++)
			{
				c[i][j]+=a[i][r]*b[r][j];
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cout<<c[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

矩阵快速幂

#include<bits/stdc++.h>
using namespace std;
long long a[110][110],ans[110][110],mod=1e9+7,n,k;
void jzcf_ans()
{
	long long c[110][110]={0};
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<=n;k++)
			{
				c[i][j]=(c[i][j]+ans[i][k]*a[k][j])%mod;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			ans[i][j]=c[i][j];
		}
    }
}
void jzcf_a()
{
	long long c[110][110]={0};
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<=n;k++)
			{
				c[i][j]=(c[i][j]+a[i][k]*a[k][j])%mod;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			a[i][j]=c[i][j];
		}
    }
}
void ksm()
{
	while(k!=0)
	{
		if(k&1==1)
		{
			jzcf_ans();
		}
		jzcf_a();
		k>>=1;
	}
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[i][j];
		}
		ans[i][i]=1;
	}
	ksm();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<ans[i][j]%mod<<" ";
		}
		cout<<endl;
	}
	return 0;
} 

%%bjt

posted @ 2025-05-17 08:16  BIxuan—玉寻  阅读(28)  评论(1)    收藏  举报