传送门
给出三个N*N的矩阵A, B, C,问A * B是否等于C?
Input
第1行,1个数N。(0 <= N <= 500)
第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16)
第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16)
第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。
Output
如果相等输出Yes,否则输出No。
Input示例
2
1 0
0 1
0 1
1 0
0 1
1 0
Output示例
Yes
解题思路:
正常我们计算矩阵乘法的时候复杂度
O(n3)
,在本题中如果是这样算的话肯定会超时,所以我们就构造一个
1∗n
的矩阵,在
A∗B=C
的左边分别乘以这个
1∗n
的矩阵,然后就将算法的复杂度降下来了,然后就为
O(n2)
,然后就想办法构造这样的一个矩阵,所以就考虑到了随机化算法,然后随机一个
1∗n
的矩阵,作为计算,最后判断就行了,然后这样写完之后莫名奇妙的超时了,结果换了
VisualC++
之后就过了,后来又将原先的代码加了输入外挂,然后在
C++
里面就过了。
My Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 502;
int a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN], rnd[MAXN], sum1[MAXN], sum2[MAXN], sum3[MAXN];
int Scan()///输入外挂
{
int res=0,ch,flag=0;
if((ch=getchar())=='-') flag=1;
else if(ch>='0'&&ch<='9')
res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-'0';
return flag?-res:res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++) for(int j=0; j<n; j++) a[i][j] = Scan();
for(int i=0; i<n; i++) for(int j=0; j<n; j++) b[i][j] = Scan();
for(int i=0; i<n; i++) for(int j=0; j<n; j++) c[i][j] = Scan();
for(int i=0; i<n; i++) rnd[i] = rand()%17;
for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum1[i] += a[j][i]*rnd[j];
for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum2[i] += b[j][i]*sum1[j];
for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum3[i] += c[j][i]*rnd[j];
int ok = 1;
for(int i=0; i<n; i++) if(sum3[i] != sum2[i]) {ok = 0; break;}
if(ok) puts("Yes");
else puts("No");
return 0;
}