C. C. Blog

Security Research, Algorithm and Data Structure

51Nod 1140 矩阵相乘结果的判断

Problem

给出三个N*N的矩阵A, B, C,问A * B是否等于C?

Solution

随机找或者用向量压缩。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<stdio.h>
#include<iostream>
#include <time.h>
#include <stdlib.h>
#define ll long long
using namespace std;
int n;
int a[520][520],b[520][520],c[520][520];
int r[520],r2[520];
int cr[520],rc[520],br[520],ra[520],abr[520],rab[520];
bool rd(){
srand(time(NULL));
int x;
int y;
for(int i=1;i<=30000;i++){
x=rand()%n+1;
y=rand()%n+1;
int sum=0;
for(int j=1;j<=n;j++){
sum+=a[x][j]*b[j][y];
}
if(sum!=c[x][y]) return false;
}
return true;
}
int main(){

scanf("%d",&n);

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++){
for(int j=1;j<=n;j++){
scanf("%d",&c[i][j]);
}
}
for(int i=1;i<=n;i++){
r[i]=i*i%101;
r2[i]=(i+3)*i%111;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cr[i]+=c[i][j]*r[j];
rc[i]+=c[j][i]*r2[j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
br[i]+=b[i][j]*r[j];
ra[i]+=a[j][i]*r2[j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
abr[i]+=a[i][j]*br[j];
rab[i]+=b[j][i]*ra[j];
}
}
bool f=true;
for(int i=1;i<=n;i++){
if(abr[i]!=cr[i]||rab[i]!=rc[i]){
f=false;
break;
}
}
//cout<<rd();
if(!f){
printf("No\n");
}
else{
//f=f&rd();
//if(f){
printf("Yes\n");
//}
//else{
//printf("No\n");
//}

}
return 0;
}
  • 本文作者: CCWUCMCTS
  • 本文链接: https://ccwucmcts.github.io/posts/44245/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!