loj #100. 矩阵乘法题解

这题是比较基础的题目,主要用于理解矩阵乘法。
\(First\) \(of\) \(all\) ,我们要知道什么是矩阵乘法?
假设有一个 \(n\) * \(p\) 的矩阵 \(A\)\(p\) * \(n\) 的矩阵 \(B\) ,如果令 \(C\) 为这两个矩阵相乘得到的乘积,那么有一个这样的式子
\(Ci,j=\sum ^{p}_ {k=1}A_{i,k}\times B_{k,j}\)
知道这个以后,我们就可以做这道题了:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define P 1000000007
using namespace std;
long long a[511][511],b[511][511],c[511][511];
inline long long read()
{
	char ch=getchar();
	long long f=0,w=1;
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		f=(f<<3)+(f<<1)+ch-'0';
		ch=getchar();
	}
	return f*w;
}
inline void write(long long x)
{
	if(x==0) return;
	if(x<0) putchar('-'),x=-x;
	write(x/10);
	putchar(x%10+'0');
} 
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int n,p,m;
	scanf("%d %d %d",&n,&p,&m);	
	for(int i=1;i<=n;++i)
		for(int j=1;j<=p;++j)
			a[i][j]=read();
	for(int i=1;i<=p;++i)
		for(int j=1;j<=m;++j)
			b[i][j]=read();
	for(register int i=1;i<=n;++i)
		for(register int k=1;k<=p;++k)
			for(register int j=1;j<=m;++j)
			{
				c[i][j]+=(a[i][k]*b[k][j]);
				c[i][j]%=P;
			}
//	printf("%d\n",-2033333333%P); 
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			if(c[i][j]<0) c[i][j]=P+c[i][j]; //若c[i][j]为负数,那么余数等于模数加上这个负数
			write(c[i][j]); 
			putchar(' ');
		}
		cout<<endl;
	}
	return 0;
}
posted @ 2019-08-10 16:08  zhz小蒟蒻  阅读(302)  评论(0编辑  收藏  举报