1849: Comparing answers
这里写链接内容
题意:题意是有矩阵A,B,然后判断A*A ?= B ,直接做O(n*n*n)
分析:矩阵降维 A*A*C ?= B*C, C 是一维向量 运算顺序为 A*(A*C) 时间复杂度为O(N*N)
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<math.h>
#include<map>
#include<queue>
#include<algorithm>
#include<ctime>;
using namespace std;
const double pi=acos(-1.0);
const int inf = 0x3f3f3f3f;
const int maxn=100005;
const double eps=1e-8;
int A[1005][1005];
int B[1005][1005];
int tmp[1005];
int n;
int ans[1005][2];
int judge(){
for (int i=1;i<=n;i++){
if (ans[i][0]!=ans[i][1])return 0;
}
return 1;
}
int main()
{
srand(time(0));
while (scanf ("%d",&n)!=EOF){
if (n==0)break;
memset (A,0,sizeof (A));
memset (B,0,sizeof (B));
memset (tmp,0,sizeof (tmp));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf ("%d",&A[i][j]);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf ("%d",&B[i][j]);
for (int i=1;i<=n;i++){//随机产生一维向量
tmp[i]=rand()%8999;
}
memset (ans,0,sizeof (ans));
//计算B*tmp
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
ans[i][1]+=B[i][j]*tmp[j];
}
}
//计算A*tmp
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
ans[i][0]+=A[i][j]*tmp[j];
}
}
//将结果存在tmp中
for(int i=1;i<=n;i++){
tmp[i]=ans[i][0];
ans[i][0]=0;
}
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
ans[i][0]+=A[i][j]*tmp[j];
}
}
int flag=judge();
if (flag)printf ("YES\n");
else printf ("NO\n");
}
return 0;
}