矩阵求逆

时间:2019-11-10
本文章向大家介绍矩阵求逆,主要包括矩阵求逆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

LuoguP4783

思路:

求A的逆矩阵,把A和单位矩阵I放在一个矩阵里

对A进行加减消元使A化成单位矩阵

此时原来单位矩阵转化成逆矩阵

原理大概就是 A(逆) * [A I] = [I A(逆)]

Code:

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const double eps = 1E-8;
 5 const int p = 1e9 + 7;
 6 const int N = 405;
 7 int n, m;
 8 ll a[N][N << 1];
 9 ll pw(ll x, ll y) {
10     ll re = 1;
11     for (; y; y >>= 1) {
12         if (y & 1) {
13             re = re * x % p;
14         }
15         x = x * x % p;
16     }
17     return re;
18 }
19 void gauss() {//高斯消元 
20     for (int i = 1; i <= n; i++) {
21         int pre = i;
22         for (int j = i + 1; j <= n; j++) {
23             if (fabs(a[j][i] - a[pre][i]) >= eps) {
24                 pre = j;
25             }
26         }
27         for (int k = 1; k <= m; k++) {//交换着两行,记得把右侧新添矩阵也交换 
28             swap(a[i][k], a[pre][k]);
29         }
30         if (fabs(a[i][i]) <= eps) {
31             printf("No Solution\n");
32             exit(0);
33         }
34         ll inv = pw(a[i][i], p - 2);//求逆元 
35         for (int k = i; k <= m; k++) {
36             a[i][k] = a[i][k] * inv % p;
37         }
38         for (int j = 1; j <= n; j++) {
39             if (i != j) {
40                 for (int k = i + 1; k <= m; k++) {//在当前矩阵进行变换时,对所求矩阵也进行同样的变换 
41                     a[j][k] = (a[j][k] - a[j][i] * a[i][k] % p + p) % p;
42                 }
43                 a[j][i] = 0;
44             }
45         }
46     }
47 }
48 int main () {
49     scanf("%d", &n);
50     for (int i = 1; i <= n; i++) {
51         for (int j = 1; j <= n; j++) {
52             scanf("%lld", &a[i][j]);
53         }
54         a[i][n + i] = 1;//另一半初始化为元矩阵 
55     }
56     m = n << 1;
57     gauss();
58     for (int i = 1; i <= n; i++) {
59         for (int j = n + 1; j <= m; j++) {
60             printf("%lld%c", a[i][j], j == m ? '\n' : ' ');
61         }
62     }
63     return 0;
64 }
View Code

原文地址:https://www.cnblogs.com/Sundial/p/11830555.html