51nod 1140 矩阵相乘结果的判断

弱弱的买了随机算法的视频水了一下2333

真的是好神

大概就是判AB=C,这样的话再等式两边同乘一个1*n的矩阵H(貌似有个专业的名字),这样矩阵乘法的复杂度就是n^2的。

因为矩阵乘法是有结合律的,所以就是先算出HA(蛤??),再算(HA)*B,然后和HC看是不是相等就好

get高端暴力姿势

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 using namespace std;
 4
 5 const int QWQ=505;
 6
 7 LL a[QWQ][QWQ],b[QWQ][QWQ],c[QWQ][QWQ];
 8 int n;
 9 LL rnd[QWQ],ans1[QWQ],ans2[QWQ],ans3[QWQ];
10
11 int main()
12 {
13     srand(time(0));
14     cin>>n;
15     for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) scanf("%lld",&a[i][j]);
16     for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) scanf("%lld",&b[i][j]);
17     for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) scanf("%lld",&c[i][j]);
18     int cnt=50;
19     while (cnt--)
20     {
21         memset(ans1,0,sizeof(ans1));
22         memset(ans2,0,sizeof(ans2));
23         memset(ans3,0,sizeof(ans3));
24         for (int i=1; i<=n; i++) rnd[i]=(LL)rand()%16;
25     //    for (int i=1; i<=n; i++) printf("%d ",rnd[i]); system("pause");
26
27         for (int i=1; i<=n; i++)
28             for (int j=1; j<=n; j++)
29                 ans1[i]+=rnd[j]*a[j][i];
30     //    for (int i=1; i<=n; i++) printf("%d ",ans1[i]); cout<<endl;
31         for (int i=1; i<=n; i++)
32             for (int j=1; j<=n; j++)
33                 ans2[i]+=ans1[j]*b[j][i];
34     //    for (int i=1; i<=n; i++) printf("%d ",ans2[i]); cout<<endl;
35         for (int i=1; i<=n; i++)
36             for (int j=1; j<=n; j++)
37                     ans3[i]+=rnd[j]*c[j][i];
38     //    for (int i=1; i<=n; i++) printf("%d ",ans3[i]); cout<<endl;
39
40         for (int i=1; i<=n; i++)
41             if (ans2[i]!=ans3[i])
42             {
43                 puts("No");
44                 return 0;
45             }
46     }
47     puts("Yes");
48     return 0;
49 }
时间: 2024-10-14 16:21:24

51nod 1140 矩阵相乘结果的判断的相关文章

C语言 &#183; 矩阵相乘 &#183; 算法提高

算法提高 矩阵相乘 时间限制:1.0s   内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的. 小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵, 要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 输入格式 输入文件共有ai+bi+2行,并且输入的所有数为整数(long long范围

矩阵相乘(C语言实现)

---恢复内容开始--- 矩阵相乘程序的简单C语言实现: 这是矩阵相乘的公式: 源代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define M 100 4 5 int main(void) 6 { 7 int i,j,k,matrix1[M][M],matrix2[M][M],row1,col1,row2,col2,matrix[M][M]; 8 /*为需要相乘的两个矩阵赋值:*/ 9 printf("输入第一个矩阵的行

MapReduce实现二阶矩阵相乘

二阶矩阵相乘公式 上例中的C11=A11*B11+A12*B21+A13*B31=1*3+0*2+2*1=5.C12=A11*B12+A12*B22+A13*B32=1*1+0*1+2*0=1 分析 因为分布式计算的特点,需要找到相互独立的计算过程,以便能够在不同的节点上进行计算而不会彼此影响.根据矩 阵乘法的公式,C中各个元素的计算都是相互独立的,即各个cij在计算过程中彼此不影响.这样的话,在Map阶段可 以把计算所需要的元素都集中到同一个key中,然后,在Reduce阶段就可以从中解析出各

MapReduce实现矩阵相乘

前言 MapReduce打开了并行计算的大门,让我们个人开发者有了处理大数据的能力.但想用好MapReduce,把原来单机算法并行化,也不是一件容易事情.很多的时候,我们需要从单机算法能否矩阵化去思考,所以矩阵操作就变成了算法并行化的基础. 矩阵介绍 为了方便说明,举两个矩阵作为示例: , 容易看出,是一个矩阵,是一个矩阵,我们能够算出: 这三个矩阵当然不大,但作为示例,它们将暂时享受大矩阵的待遇. 矩阵稀疏存储 理论上,在一个文件中存储4000万*4000万的矩阵当然是可以的,但非常失之优雅,

【CUDA并行编程之四】矩阵相乘

前面介绍了基本的Cuda编程的相关知识,那么这一篇在此基础之上来看看GPU在处理数据计算上的高效能,我们拿矩阵相乘来作为例子. 1.CPU上执行矩阵相乘以及性能. 在CPU上进行矩阵相乘运算的代码: mat_mul.cc: <span style="font-family:Microsoft YaHei;font-size:18px;">//a[i]*b[i] + c[i] = d[i] #include<iostream> #include<vector

矩阵相乘

有一个x*y的矩阵和一个y*z矩阵相乘,元素均为整数,求两个矩阵相乘得到的矩阵.这是一道华为OJ题,具体描述忘记了,大致内容如此.并且要求实现的函数参数为指针. 例如矩阵1为 int m1[1][3]={2,-6,3}; 矩阵2为 int m2[3][1]={4,-2,-4}; 乘积矩阵初始化为 int r[1][1]=0; 要求实现的函数为 void matrix_multiple(int *m1,int *m2,int *r,int x,int y,int z) 代码如下: void mat

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

ObjC语法练习 冒泡排序、选择排序、矩阵相乘

用OC实现的冒泡排序.选择排序.矩阵相乘,纯粹是用来练习语法. 冒泡排序,程序如下: void bubbleSort() { //初始化数组 NSMutableArray *array1 = [[NSMutableArray alloc] initWithCapacity:8]; [array1 addObject:@"5"]; [array1 addObject:@"10"]; [array1 addObject:@"8"]; [array1

cublas 矩阵相乘API详解

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include "cublas_v2.h" void multiCPU(float *c, float *a, float *b, unsigned int aH, unsigned int aW, unsigned int