50180. Matrix Multiplication
難度:3/51
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#include <stdio.h>
#include <string.h>
#include <stdint.h>
int n;
char name_a[32], name_b[32], name_c[32];
int len_a, len_b, len_c;
int32_t mtx_a[32][32], mtx_b[32][32];
int64_t mtx_c[32][32];
void get_name(char* name, int len, int x){
if(x <= 9){
name[len] = '0' + x;
name[len + 1] = '\0';
}
else{
name[len] = '0' + (x / 10);
name[len + 1] = '0' + (x % 10);
name[len + 2] = '\0';
}
}
void get_arr(int32_t arr[32][32], char* prefix, int len){
for(int i = 0; i < n; i++){
get_name(prefix, len, i + 1);
FILE* f = fopen(prefix, "rb");
fread(arr[i], sizeof(int32_t), n, f);
}
}
void place_arr(int64_t arr[32][32], char* prefix, int len){
for(int i = 0; i < n; i++){
get_name(prefix, len, i + 1);
FILE* f = fopen(prefix, "wb");
fwrite(arr[i], sizeof(int64_t), n, f);
}
}
void print_32mtx(int32_t arr[32][32]){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%d", arr[i][j]);
}
printf("\n");
}
}
void print_64mtx(int64_t arr[32][32]){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%d", arr[i][j]);
}
printf("\n");
}
}
void compute(int32_t a[32][32], int32_t b[32][32], int64_t c[32][32]){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
int64_t cnt = 0;
for(int k = 0; k < n; k++){
cnt += (int64_t)a[i][k] * (int64_t)b[k][j];
}
c[i][j] = cnt;
}
}
}
int main(){
scanf("%d", &n);
scanf("%s %s %s", name_a, name_b, name_c);
len_a = strlen(name_a), len_b = strlen(name_b), len_c = strlen(name_c);
get_arr(mtx_a, name_a, len_a);
get_arr(mtx_b, name_b, len_b);
compute(mtx_a, mtx_b, mtx_c);
// print_32mtx(mtx_a); printf("\n");
// print_32mtx(mtx_b); printf("\n");
// print_64mtx(mtx_c); printf("\n");
place_arr(mtx_c, name_c, len_c);
}