【传送门:51nod-1140】
简要题意:
给出矩阵A,B,C,判断A*B是否等于C
题解:
对于一般的判定,自然是n3将A*B求出来,然后再逐位判断
但是这自然是超时的
那么我们可以随机出一个高度为1,长度为n的矩阵X
如果A*B=C,那么根据结合律我们可以得到X*A*B=X*C,而求X*A*B和X*C显然只用n2的时间,那么这样我们就能判断出是否相等
PS:如果觉得得出的答案不保险,可以随机多次
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<ctime> using namespace std; typedef long long LL; struct node { LL a[510][510]; node() { memset(a,0,sizeof(a)); } }A,B,C,cmp; int n; node chengfa(node a,node b) { node c; for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { c.a[1][j]+=a.a[1][k]*b.a[k][j]; } } return c; } bool check(node a,node b) { for(int i=1;i<=n;i++) if(a.a[1][i]!=b.a[1][i]) return false; return true; } int main() { //srand(time(0)); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&A.a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&B.a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&C.a[i][j]); for(int i=1;i<=n;i++) cmp.a[1][i]=rand()%10000+2; node a,b; a=chengfa(chengfa(cmp,A),B),b=chengfa(cmp,C); if(check(a,b)==true) printf("Yes "); else printf("No "); return 0; }