这题是比较基础的题目,主要用于理解矩阵乘法。
\(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; }