1
- #include < bits/stdc++.h>
1
+ #include < iostream>
2
+ #include < vector>
3
+
4
+ #include < gmpxx.h>
2
5
3
6
template <typename T>
4
7
void equalize_row (std::vector<T> const & A, std::vector<T> &B, T ratio) {
@@ -8,6 +11,13 @@ void equalize_row(std::vector<T> const& A, std::vector<T> &B, T ratio) {
8
11
}
9
12
}
10
13
14
+ template <typename T>
15
+ void divide_row (std::vector<T> &A, T ratio) {
16
+ for (T& num : A) {
17
+ num /= ratio;
18
+ }
19
+ }
20
+
11
21
template <typename T>
12
22
void print_matrix (std::vector<T> const & A) {
13
23
for (auto & row : A) {
@@ -27,48 +37,52 @@ std::vector<std::vector<T>> inverse(std::vector<std::vector<T>> M) {
27
37
R[i][i] = T (1 );
28
38
}
29
39
30
- for (int32_t i = 0 ; i+ 1 < n; i++) {
31
- T cut_base = M[i][i] ;
40
+ for (int32_t i = 0 ; i < n; i++) {
41
+ int32_t best = i ;
32
42
for (int32_t j = i+1 ; j < n; j++) {
33
- T ratio = - M[j][i] / cut_base;
34
- equalize_row (M[i], M[j], ratio);
35
- equalize_row (R[i], R[j], ratio);
43
+ if (abs (M[best][i]) < abs (M[j][i])) {
44
+ best = j;
45
+ }
46
+ }
47
+ if (best != i) {
48
+ std::swap (M[i], M[best]);
49
+ std::swap (R[i], R[best]);
50
+ }
51
+
52
+ divide_row<T>(R[i], M[i][i]);
53
+ divide_row<T>(M[i], M[i][i]);
54
+
55
+ for (int32_t j = i+1 ; j < n; j++) {
56
+ T ratio = -M[j][i];
57
+ equalize_row<T>(M[i], M[j], ratio);
58
+ equalize_row<T>(R[i], R[j], ratio);
36
59
}
37
60
}
38
61
39
62
for (int32_t i = n-1 ; i > 0 ; i--) {
40
- T cut_base = M[i][i];
41
63
for (int32_t j = i-1 ; j >= 0 ; j--) {
42
- T ratio = - M[j][i] / cut_base;
43
- equalize_row (M[i], M[j], ratio);
44
- equalize_row (R[i], R[j], ratio);
64
+ equalize_row<T>(R[i], R[j], -M[j][i]);
65
+ equalize_row<T>(M[i], M[j], -M[j][i]);
45
66
}
46
67
}
47
68
48
- print_matrix (M);
49
- for (int32_t i = 0 ; i < n; i++) {
50
- if (M[i][i] != T (1 )) {
51
- T ratio = T (1 ) / M[i][i] - T (1 );
52
- equalize_row (R[i], R[i], ratio);
53
- equalize_row (M[i], M[i], ratio);
54
- }
55
- }
56
- print_matrix (M);
57
69
return R;
58
70
}
59
71
60
72
int main () {
73
+ using rational = mpq_class;
74
+
61
75
int32_t n;
62
76
std::cin >> n;
63
77
64
- auto M = std::vector<std::vector<double >>(n, std::vector<double >(n));
78
+ auto M = std::vector<std::vector<rational >>(n, std::vector<rational >(n));
65
79
for (auto & row : M) {
66
80
for (auto & x : row) {
67
81
std::cin >> x;
68
82
}
69
83
}
70
84
71
- auto ans = inverse (M);
85
+ auto A = inverse<rational> (M);
72
86
73
- print_matrix (ans );
87
+ print_matrix (A );
74
88
}
0 commit comments