8 solutions

  • 4
    @ 2021-10-4 16:57:07

    比如:

    (此图来自网络)

    代码如下:

    #include<cstdio>
    #define ll long long
    
    using namespace std;
    ll a[505][505],b[505][505];
    const ll mod=1000000007;
    ll n,m,p;
    
    inline ll read(){
    	ll a=0,k=1;
    	char c=getchar();
    	while (!('0'<=c&&c<='9')){
    		if (c=='-'){
    			k*=-1;
    		}
    		c=getchar();
    	}
    	while ('0'<=c&&c<='9'){
    		a=a*10+c-'0';
    		c=getchar();
    	}
    	return a*k;
    }
    
    int main(){
    	n=read(),p=read(),m=read();
    	for (ll i=1;i<=n;i++){
    		for (ll j=1;j<=p;j++){
    			a[i][j]=read();
    		}
    	}
    	for (ll i=1;i<=p;i++){
    		for (ll j=1;j<=m;j++){
    			b[i][j]=read();
    		}
    	}
    	for (ll i=1;i<=n;i++){
    		for (ll j=1;j<=m;j++){
    			ll tmp=0;
    			for (ll k=1;k<=p;k++){
    				tmp=(tmp+(a[i][k]*b[k][j]+mod)%mod+mod)%mod;
    			}
    			printf("%lld ",tmp);
    		}
    		putchar('\n');
    	}
    	return 0;
    }
    • 3
      @ 2022-6-9 15:19:14

      模板题,下面提供一份封装的矩乘板子:

      #include <cstring>
      #include <iostream>
      
      using std::cin;
      using std::cout;
      const char endl = '\n';
      
      const int N = 1005,
                mod = 1e9 + 7;
      
      int n, m, p;
      
      class Matrix {
        private:
          int data[N][N];
      
        public:
          Matrix() {
              memset(data, 0x00, sizeof(data));
          }
      
          int* operator[](int i) {
              return data[i];
          }
      
          Matrix operator*(Matrix b) const {
              Matrix c;
      
              for (int i = 1; i <= n; i++) {
                  for (int j = 1; j <= p; j++) {
                      for (int k = 1; k <= m; k++) {
                          c[i][j] = (c[i][j] + 1ll * data[i][k] * b[k][j] % mod) % mod;
                      }
                  }
              }
      
              return c;
          }
      } a, b, c;
      
      int main() {
          std::ios::sync_with_stdio(false);
      
          cin >> n >> m >> p;
      
          for (int i = 1; i <= n; i++) {
              for (int j = 1; j <= m; j++) {
                  cin >> a[i][j];
              }
          }
      
          for (int i = 1; i <= m; i++) {
              for (int j = 1; j <= p; j++) {
                  cin >> b[i][j];
              }
          }
      
          c = a * b;
      
          for (int i = 1; i <= n; i++) {
              for (int j = 1; j <= p; j++) {
                  cout << (c[i][j] % mod + mod) % mod << ' ';
              }
              cout << endl;
          }
      
          return 0;
      }
      
      • 2
        @ 2023-1-25 14:01:17

        【模板】矩阵乘法

        这道题是一道模板题,还不会的同志们看下面这张图:

        image


        比如说: 给出一个矩阵A: 1 2 3 3 2 1 再给出矩阵B: 1 1 2 2 3 3 根据公式得出矩阵C: 14 14 10 10

        过程如下

        image

        那么按照公式模拟即可,别忘了取模!(尽量一边算一边mod 代码:

        #include <bits/stdc++.h>
        using namespace std;
        long long A[1114][1114],B[1114][1114],C[1114][1114];
        const long long mod=1000000007;
        int main(){
        int n,m,k;
        cin>>n>>m>>k;
        for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
        cin>>A[i][j];
        }
        }
        for(int i=1;i<=m;i++){
        for(int j=1;j<=k;j++){
        cin>>B[i][j];
        }
        }
        for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
        long long sum=0;
        for(int l=1;l<=m;l++){
        sum=(sum+(A[i][l]*B[l][j]+mod)%mod+mod)%mod;
        }
        C[i][j]=sum%1000000007;
        //cout<<sum<<" ";
        }
        //cout<<endl;
        }
        //if(you use the grey one)return 0 here
        for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
        cout<<C[i][j]<<" ";
        }
        cout<<endl;
        }
        return 0;
        

        完结撒花!!!

        • 1
          @ 2023-10-28 8:54:39
          #include<bits/stdc++.h>
          #define ll long long
          
          using namespace std;
          ll a[505][505],b[505][505];
          const ll mod=1000000007;
          ll n,m,p;
          
          inline ll read(){**
          	ll a=0,k=1;
          	char c=getchar();
          	while (!('0'<=c&&c<='9')){
          		if (c=='-'){
          			k*=-1;
          		}
          		c=getchar();
          	}
          	while ('0'<=c&&c<='9'){
          		a=a*10+c-'0';
          		c=getchar();
          	}
          	return a*k;
          }
          
          int main(){
          	n=read(),p=read(),m=read();
          	for (ll i=1;i<=n;i++){
          		for (ll j=1;j<=p;j++){
          			a[i][j]=read();
          		}
          	}
          	for (ll i=1;i<=p;i++){
          		for (ll j=1;j<=m;j++){
          			b[i][j]=read();
          		}
          	}
          	for (ll i=1;i<=n;i++){
          		for (ll j=1;j<=m;j++){
          			ll tmp=0;
          			for (ll k=1;k<=p;k++){
          				tmp=(tmp+(a[i][k]*b[k][j]+mod)%mod+mod)%mod;
          			}
          			printf("%lld ",tmp);
          		}
          		putchar('\n');
          	}
          	return 0;
          }
          
          • 0
            @ 2023-3-25 9:37:55
            #include<cstdio>
            #define ll long long
            
            using namespace std;
            ll a[505][505],b[505][505];
            const ll mod=1000000007;
            ll n,m,p;
            
            inline ll read(){
            	ll a=0,k=1;
            	char c=getchar();
            	while (!('0'<=c&&c<='9')){
            		if (c=='-'){
            			k*=-1;
            		}
            		c=getchar();
            	}
            	while ('0'<=c&&c<='9'){
            		a=a*10+c-'0';
            		c=getchar();
            	}
            	return a*k;
            }
            
            int main(){
            	n=read(),p=read(),m=read();
            	for (ll i=1;i<=n;i++){
            		for (ll j=1;j<=p;j++){
            			a[i][j]=read();
            		}
            	}
            	for (ll i=1;i<=p;i++){
            		for (ll j=1;j<=m;j++){
            			b[i][j]=read();
            		}
            	}
            	for (ll i=1;i<=n;i++){
            		for (ll j=1;j<=m;j++){
            			ll tmp=0;
            			for (ll k=1;k<=p;k++){
            				tmp=(tmp+(a[i][k]*b[k][j]+mod)%mod+mod)%mod;
            			}
            			printf("%lld ",tmp);
            		}
            		putchar('\n');
            	}
            	return 0;
            }
            
            • -5
              @ 2021-12-17 21:35:32
              #include <bits/stdc++.h>
              #include <windows.h>
              #define ll long long
              #define mod 1000000007
              #define maxn 510
              inline int read()
              {
                  int X = 0; bool f = false; char ch = getchar();
                  while (ch > '9' || ch < '0') {f |= ch == '-'; ch = getchar();}
                  while (ch <= '9' && ch >= '0') {X = (X << 3) + (X << 1) + (ch ^ 48); ch = getchar();}
                  return f ? -X : X;
              }
              inline void write(ll X)
              {
                  if (X == 0) {putchar('0'); return;}
                  if (X < 0) {/*putchar('-'); X = -X;*/ X += mod;}
                  short cnt = 0; char ch[31];
                  while (X) {ch[++cnt] = (X % 10) ^ 48; X /= 10;}
                  while (cnt) putchar(ch[cnt--]);
                  return;
              }
              int n, p, m;
              ll A[maxn][maxn], B[maxn][maxn], ANS[maxn][maxn];
              int main()
              {
                  n = read(); p = read(); m = read();
                  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 (int i = 1; i <= n; ++i)
                  {
                      for (int j = 1; j <= m; ++j)
                      {
                          for (int k = 1; k <= p; ++k)
                          {
                              ANS[i][j] = (ANS[i][j] + (A[i][k] * B[k][j] % mod)) % mod;
                          }
                          write(ANS[i][j]); putchar(' ');
                      }
                      putchar('\n');
                  }
                  system("pause");
                  return 0;
              }
              
              • -11
                @ 2021-9-26 8:13:50

                不会把还有人不知道矩阵乘法

                #include<bits/stdc++.h>
                #define int long long//记得开longlong
                using namespace std;
                const int N = 600, M = 1e9 + 7;
                int a[N][N], b[N][N];
                inline int max(int x, int y){return x > y ? x : y;}
                inline int min(int x, int y){return x > y ? y : x;}
                inline int read(){
                	int x = 0, f = 1; char c = getchar();
                	while (!isdigit(c)){if (c == '-') f = -1; c = getchar();}
                	while (isdigit(c)){x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); }
                	return x * f;
                }
                inline void write(int x){
                	if (x < 0) {x = ~(x - 1); putchar('-');}
                	if (x > 9) write(x / 10);
                	putchar(x % 10 ^ 48);
                }
                signed main(){
                	int n = read(), p = read(), m = read();
                	for (int i = 1; i <= n; i ++)
                	    for (int j = 1; j <= p; j ++)
                	        a[i][j] = (read() + M) % M;//记得取模
                	for (int i = 1; i <= p; i ++)
                	    for (int j = 1; j <= m; j ++)
                	        b[i][j] = (read() + M) % M;//记得取模
                	for (int i = 1; i <= n; i ++){
                	    for (int j = 1; j <= m; j ++){
                	    	int sum = M;
                	    	for (int k = 1; k <= p; k ++)
                	    	    sum = (sum + a[i][k] * b[k][j]) % M;
                	    	write(sum % M);putchar(' ');
                		}
                		puts("");
                	}
                	return 0;
                }
                • -23
                  @ 2021-9-15 20:59:30

                  az,不会

                  • 1

                  Information

                  ID
                  60
                  Time
                  2000ms
                  Memory
                  256MiB
                  Difficulty
                  3
                  Tags
                  # Submissions
                  530
                  Accepted
                  140
                  Uploaded By