[模板] 矩阵乘法,矩阵快速幂,矩阵幂

1.普通乘法

当且仅当方阵A行等于方阵B列时才可以进行矩阵乘法运算。

#include <iostream>
using namespace std;
int a[300][300];
int b[300][300];
int ans[300][300];
int main()
{
	int m,s,n;
	cin>>m>>s>>n;
	for(int i = 0;i < m; i++)
		for(int j = 0;j < s; j++)
			cin>>a[i][j];
	for(int i = 0;i < s; i++)
		for(int j = 0;j < n; j++)
			cin>>b[i][j];
	for(int i = 0;i < m; i++)
	{
		for(int j = 0;j < n; j++)
		{
			int tmp = 0;
			for(int k = 0;k < s; k++)
			{
				tmp += a[i][k] * b[k][j];    //核心算法
			}
			ans[i][j] = tmp;
		}
	}
	for(int i = 0; i < m; i++)
	{
		for(int j = 0;j < n; j++)
		{
			cout<<ans[i][j]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

2.方幂乘法

只有方阵才可以进行幂运算

1·朴素算法

#include <iostream>
using namespace std;
int a[1010][1010] = {0};
int b[1010][1010] = {0};
int ans[1010][1010] = {0};
int n,m;
int main()
{
	cin>>n>>m;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			cin>>a[i][j];
	if(m == 0)
	{
		for(int i = 0;i < n; i++)
		{
			for(int j = 0;j < n; j++)
			{
				if(i == j)
					cout<<1<<' ';     //1000
				else                      //0100
					cout<<0<<' ';     //0010
			}                                 //0001
			cout<<endl;
		}
		return 0;
	}
	if(m == 1)
	{
		for(int i = 0;i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				cout<<a[i][j]<<' ';
			}
			cout<<endl;
		}
		return 0;
	}
	m--;
	int flag = 0;
	while(m--)
	{
		if(!flag)
			memcpy(b,a,sizeof(a));
		else
			memcpy(b,ans,sizeof(a));
		for(int i = 0;i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				int tmp = 0;
				for(int k = 0; k < n; k++)
				{
					tmp += a[i][k] * b[k][j];//核心计算
					ans[i][j] = tmp;
				}
			}
		}
		flag = 1;
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = 0;j < n; j++)
		{
			cout<<ans[i][j]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

2·快速幂

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 110;
const int MOD = 1e9 + 7;
typedef long long ll;

struct mat				 //构建矩阵结构体 
{
	ll arr[MAXN][MAXN];
	void reset()		 //重置为E矩阵 
	{
		for(int i = 0; i < MAXN; i++)
		{
				arr[i][i] = 1;
		}
	}
};

mat mul(mat x, mat y, int n)		//乘法运算 
{
	mat ans;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			ans.arr[i][j] = 0;
			for(int k = 0; k < n; k++)
			{
				ans.arr[i][j] += (x.arr[i][k] * y.arr[k][j]) % MOD;
			}
			ans.arr[i][j] %= MOD;
		}
	}
	return ans;
}

mat  qpow(mat a, int m, int n) //快速幂 
{
	mat ans;
	ans.reset();
	while(m)
	{
		if(m & 1)
			ans = mul(ans, a, n);
		a = mul(a, a, n);
		m /= 2;
	}
	return ans;
}
int main()
{
	mat a;
	int n, m; //n为方阵维数, m为幂次数 
	cin>>n>>m;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cin>>a.arr[i][j];
		}
	}
	
	mat ans = qpow(a, m, n);
	
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cout<<ans.arr[i][j]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

模板

原文地址:https://www.cnblogs.com/zeolim/p/12270770.html