![](http://file.51nod.com/images/icon/star.png)
![](http://file.51nod.com/images/icon/plus.png)
给出三个N*N的矩阵A, B, C,问A * B是否等于C?
Input
第1行,1个数N。(0 <= N <= 500) 第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16) 第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16) 第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。
Output
如果相等输出Yes,否则输出No。
Input示例
2 1 0 0 1 0 1 1 0 0 1 1 0
Output示例
Yes
这份代码基本是照着别人的思路写的...
一开始自己写的随机是找随机的行和列然后计算看是否正确 但是只能过前面的数据 后面几组数据大的试了十几次不是WA就是T...
看来就算写随机算法还是要找优化一点的
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
#include <time.h>
using namespace std;
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w",stdout);
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
typedef pair<int, int> PII;
using namespace std;
const int maxn = 500 + 5;
int a[maxn][maxn];
int b[maxn][maxn];
int c[maxn][maxn];
int x[maxn][maxn];
int n;
int main() {
//FIN
while(~scanf("%d", &n)) {
int num;
for(int i = 1; i <= n; i++) {
x[0][i] = rand() % 10000 + 1;
x[1][i] = rand() % 10000 + 1;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%d", &num);
a[0][j] += x[0][i] * num;
a[1][j] += x[1][i] * num;
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%d", &num);
b[0][j] += a[0][i] * num;
b[1][j] += a[1][i] * num;
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%d", &num);
c[0][j] += x[0][i] * num;
c[1][j] += x[1][i] * num;
}
}
int flag = 0;
for(int i = 1; i <= n; i++) {
if(b[0][i] != c[0][i] || b[1][i] != c[1][i]) flag = 1;
if(flag) break;
}
if(!flag) puts("Yes");
else puts("No");
}
return 0;
}