随机算法
直接随机i,j会跪,因为可能只有一个格子不一样但是没有随机到
为了有效利用所有数据
(看了题解)可以构造列向量X,使得ABX=CX
利用了所有数据,很有效的O(n^2)判定
哪怕test=1都能过
很好奇test=1和test=10的时间为什么差距这么小...
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 510
#define LL long long
LL A[N][N],B[N][N],C[N][N],X[N],Y1[N],Y2[N],tp[N];
int main(){
int n,i,j;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%lld",&A[i][j]);
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%lld",&B[i][j]);
for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%lld",&C[i][j]);
int flag=1;
int test=1;
while(test--){
if(!flag)break;
X[0]=rand()%n;
for(i=1;i<n;i++)X[i]=X[i-1]+rand()%n;
for(i=0;i<n;i++){
tp[i]=0;
for(j=0;j<n;j++)tp[i]+=X[j]*B[i][j];
}
for(i=0;i<n;i++){
Y1[i]=0;
for(j=0;j<n;j++)Y1[i]+=tp[j]*A[i][j];
}
for(i=0;i<n;i++){
Y2[i]=0;
for(j=0;j<n;j++)Y2[i]+=X[j]*C[i][j];
}
for(i=0;i<n;i++)if(Y1[i]!=Y2[i]){flag=0;break;}
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}
本文介绍了一种通过构造特定向量来高效验证两个矩阵相乘是否等于第三个矩阵的有效方法。该方法采用随机化策略,利用O(n²)的时间复杂度进行判断,确保了算法的高效性和准确性。
922

被折叠的 条评论
为什么被折叠?



