Description
给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。
对于90%的数据,N不超过100;
对于100%的数据,N不超过1000,矩阵中的数字大于等于0小于1000,数据组数不超过5组。
Solution
直接做就有90‘的大水题。。
我们随机一个n1的矩阵R,若B(AR)=CR说明A*B极有可能=C。我比较脸黑随机10次才能对
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#define rep(i,st,ed) for (register int i=st;i<=ed;++i)
#define fill(x,t) memset(x,t,sizeof(x))
const int N=1005;
struct Mat {
int rc[N][N],n,m;
int* operator [](int x) {
return rc[x];
}
Mat operator *(Mat B) {
Mat C; C.n=n; C.m=B.m;
rep(i,1,n) rep(j,1,m) {
C[i][j]=0;
rep(k,1,B.m) C[i][j]+=rc[i][k]*B[k][j];
}
return C;
}
bool operator ==(Mat B) {
if (n!=B.n||m!=B.m) return false;
rep(i,1,n) rep(j,1,m) {
if (rc[i][j]!=B[i][j]) return false;
}
return true;
}
void get() {
rep(i,1,m) rc[1][i]=rand()%1000;
}
} A,B,C,D,E,F;
int read() {
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
int main(void) {
freopen("data.in","r",stdin);
freopen("myp.out","w",stdout);
srand(19260817);
for (int n;~scanf("%d",&n);) {
bool flag=false;
rep(i,1,n) rep(j,1,n) A[i][j]=read();
rep(i,1,n) rep(j,1,n) B[i][j]=read();
rep(i,1,n) rep(j,1,n) C[i][j]=read();
A.n=A.m=B.n=B.m=C.n=C.m=n; D.n=1; D.m=n;
for (int wjp=10;wjp--;) {
D.get();
E=D*C; D=D*A; D=D*B;
if (E==D) continue;
flag=true; break;
}
flag?puts("No"):puts("Yes");
}
return 0;
}