题意:题意是有矩阵A,B,然后判断A*A ?= B ,直接做O(n*n*n)
分析:矩阵降维 A*A*C ?= B*C, C 是一维向量 运算顺序为 A*(A*C) 时间复杂度为O(N*N)
代码:
#include<bits/stdc++.h>
#define maxn 1100
using namespace std;
int n,A[maxn][maxn],B[maxn][maxn],X[maxn];
int A1[maxn],A2[maxn],B1[maxn];
int C[maxn];
//X*A*A=X*B
int main(){
while(scanf("%d",&n)!=EOF){
bool flag=true;
memset(A1,0,sizeof(A1));
memset(B1,0,sizeof(B1));
memset(X,0,sizeof(X));
if(n==0) break;
for(int i=0;i<n;i++) {
C[i]=rand()%9999;
X[i]=C[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&A[i][j]);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&B[i][j]);
}
}
//计算x*A,保存在A1中
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
A1[i]+=X[j]*A[i][j];
}
}
//计算x*B,保存在B1中
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
B1[i]+=X[j]*B[i][j];
}
}
//计算A1*A,保存在A2中
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
A2[i]+=A1[j]*A[i][j];
}
}
//比较A2和B1大小
for(int i=0;i<n;i++){
if(A2[i]!=B1[i]){
flag=false;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}