loj #100. 矩阵乘法

题目描述

这是一道模板题。

分别给定 n×p n \times pn×p 和 p×m p \times mp×m 的两个矩阵 A AA 和 B BB,求 A×B A \times BA×B。

输入格式

第一行三个正整数 n nn、p pp、m mm,表示矩阵的长宽。
之后的 n nn 行,每行 p pp 个整数,表示矩阵 A AA。
之后的 p pp 行,每行 m mm 个整数,表示矩阵 B BB。

输出格式

输出 n nn 行,每行 m mm 个整数,表示矩阵 A×B A \times BA×B,每个数模 109+7 10 ^ 9 + 710?9??+7 输出。

样例

样例输入

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

样例输出

999999898 149 153 999999929 999999951
999999997 999999979 999999883 74 999999921
999999835 103 55 95 999999857

数据范围与提示

1≤n,p,m≤500, −109≤Ai,j,Bi,j≤109 1 \leq n, p, m \leq 500,\ -10 ^ 9 \leq A_{i, j}, B_{i, j} \leq 10 ^ 91≤n,p,m≤500, −10?9??≤A?i,j??,B?i,j??≤10?9??

矩阵乘法

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=510,mod=1e9+7;
int a[N][N],b[N][N],c[N][N];
int n,p,m;
int main()
{
    scanf("%d%d%d",&n,&p,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=p;j++)scanf("%d",&a[i][j]),a[i][j]=(a[i][j]+mod)%mod;
    for(int i=1;i<=p;i++)
        for(int j=1;j<=m;j++)scanf("%d",&b[i][j]),b[i][j]=(b[i][j]+mod)%mod;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                c[i][j]=(long long)(1ll*c[i][j]+1ll*a[i][k]*b[k][j]%mod)%mod;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)printf("%d ",c[i][j]);
        puts("");
    }
    return 0;
}
时间: 2024-11-05 18:41:35

loj #100. 矩阵乘法的相关文章

LibreOJ #100. 矩阵乘法

二次联通门 : LibreOJ #100. 矩阵乘法 /* LibreOJ #100. 矩阵乘法 矩阵乘法 注意两个矩阵宽与高相乘的顺序 */ #include <cstdio> #define Max 500 #define Mod 1000000007 int main (int argc, char *argv[]) { static long long a[Max + 1][Max + 1], b[Max + 1][Max + 1]; int N, P, M; scanf("

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

基于OpenMP的矩阵乘法实现及效率提升分析

一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <iostream> #include <omp.h> // OpenMP编程需要包含的头文件 #include <time.h> #include <stdlib.h> using namespace std; #define MatrixOrder 1024 #def

*HDU2254 矩阵乘法

奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2990    Accepted Submission(s): 761 Problem Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up!比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差... 题解也是看了好半天,有点难理解. 感觉PoPoQQQ神犇讲得还是比较清楚的.传送门:http://blog.csdn.net/popoqqq/article/details/40188173 我们用dp[

矩阵乘法2(codevs3147)

题目描述 Description 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. 输入描述 Input Description 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一个矩阵. 接下来n行,每行n个非负整数,表示第二个矩阵. 接下来m行,每行四个正整数a,b,c,d,表示询问第一个矩阵与第二个矩阵的积中, 以第a行第b列与第c行第d列为顶点的子矩阵中的元素和. 输出描述 Output Description 对每次询问,输出一行一个整数,表示该次询问的答案.

poj2778DNA Sequence(AC自动机+矩阵乘法)

链接 看此题前先看一下matrix67大神写的关于十个矩阵的题目中的一个,如下: 经典题目8 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值    把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j.令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点).类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数.同理,如果要求经过k步的路径数,我们只需要二分求出A^k