矩阵乘法(matrix multiplication)

1.什么叫矩阵

第一行三个正整数 nn、pp、mm,表示矩阵的长宽。
之后的nn行,每行pp个整数,表示矩阵AA。
之后的pp行,每行mm个整数,表示矩阵BB。
Output
输出nn行,每行mm个整数,表示矩阵A \times BA×B,
每个数模10^9 + 7输出(本例有加这一条件,若正常,去掉即可)

2.图示

(1)先以当前行遍历与列对应相加之和入矩阵3相应位置
在这里插入图片描述

(2)然后换行(或列)
在这里插入图片描述

(3)最后换列(或行)
在这里插入图片描述

3.图示部分代码

for (int i = 0;i<m;i++) //行遍历,列遍历相乘之和入矩阵3
for(int j=0;j<n;j++)
for(int k=0;k<p;k++)
NUM[j][i]=(NUM[j][i]+(Num1[j][k]*Num2[k][i])%mod)%mod;

(x+mod) % mod=x % mod+mod % mod=x % mod 相当于把负数变正数

4.样例

Sample Input 1
3 4 5
-2 -8 -9 8
-10 0 6 -8
-10 -6 6 9
4 -7 5 -5 9
10 -2 -10 5 5
-3 -7 -3 8 -2
-6 7 7 3 -2
Sample Output 1
999999898 149 153 999999929 999999951
999999997 999999979 999999883 74 999999921
999999835 103 55 95 999999857

5.代码

用long long处理数据,最后输出的结果必须都是正数并且行尾不能有多余空格,提示一下负数转成正数的方法
(x + mod) % mod
代码及注释

(x + mod) \ \% \ mod = x \ \% \ mod + mod \ \% \ mod = x \ \% \ mod(x+mod) % mod=x % mod+mod % mod=x % mod*
代码及注释
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int main()
{
int  n,p,m;
 cin>>n>>p>>m;
 if(1<=n,p,m<=500)
 {
   long long Num1[n][p],Num2[p][m],NUM[n][m];
 for(int i=0;i<n;i++) //输入矩阵1
 for(int j=0;j<p;j++)
 {
   cin>>Num1[i][j];
  Num1[i][j]=(Num1[i][j]%mod+mod)%mod;
 }
 for(int i=0;i<p;i++)//输入矩阵2
 for(int j=0;j<m;j++)
 {
   cin>>Num2[i][j];
   Num2[i][j]=(Num2[i][j]%mod+mod)%mod;
 }

 for (int i=0; i<n; i++)  //初始化矩阵3
		for (int j=0; j<m; j++)
			NUM[i][j] = 0;
      

for (int i = 0;i<m;i++) //行遍历,列遍历相乘之和入矩阵3
for(int j=0;j<n;j++)
for(int k=0;k<p;k++)
NUM[j][i]=(NUM[j][i]+(Num1[j][k]*Num2[k][i])%mod)%mod;//(x+mod) % mod=x % mod+mod % mod=x % mod   相当于把负数变正数

int g=0;
for(int i=0;i<n;i++) //输出
{
for(int j=0;j<m;j++)
{  g++;
if(NUM[i][j]<=0)NUM[i][j]=NUM[i][j]+1000000007;
 cout<<NUM[i][j];
 if(j!=m-1)cout<<" "; 

}
 if(g!=n*m)cout<<endl;
}
 }
 system("pause");
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王也枉不了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值