题意:题意是有矩阵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;
}