1 solutions

  • 1
    @ 2021-12-31 19:10:40

    运算规则:将第一个矩阵的第i行的每个元素分别乘上第二个矩阵第j列的每个元素然后进项相加,得到的结果就为新矩阵的第i行第j列的元素。 代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define mod 1000000007
    #define ll long long
    ll w[507][507],s[507][507];//不开long long见祖先
    ll ans[507][507];
    int main(){
    	int n,m,p;
    	cin>>n>>m>>p;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			cin>>w[i][j];//输入
    		}
    	}
    	for(int i=1;i<=m;i++){
    		for(int j=1;j<=p;j++){
    			cin>>s[i][j];//输入
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=p;j++){
    			long long sum=0;
    			for(int k=1;k<=m;k++){
    				sum=(sum%mod+w[i][k]*s[k][j]%mod)%mod;//对应相乘并取模
    			}
    			if(sum<0)cout<<sum+mod<<" ";//负数加个模
    			else cout<<sum<<" ";	
    		}
    		cout<<endl;	
    	}
    	return 0;
    }
    
    • @ 2021-12-31 19:20:05

      for(int k=1;k<=m;k++){ sum+=((w[i][k]%1000000007)*(s[k][j]%1000000007))%1000000007; } 这样哪里有错

    • @ 2021-12-31 19:22:57

      @ sum也同时要取模

    • @ 2022-2-12 14:09:53

      @ 为什么最终sum还要取模呀

    • @ 2022-4-1 18:04:25

      @ 这里 之所以 把每个 乘数 都取余,就是 害怕 超过 数据范围。

      sum 每次 都会得到 一个 较大的 加数,然后 再去 和 下一个 乘积的结果 相加,那 就很有可能 还是会超过 long long 的范围。所以 当然 sum 每次 也都需要 取余了。

  • 1

Information

ID
89
Time
2000ms
Memory
256MiB
Difficulty
7
Tags
# Submissions
330
Accepted
71
Uploaded By