• 矩阵求逆


    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
    ");
    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 ? '
    ' : ' ');
    61         }
    62     }
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    Knol of Fabio Maulo
    调用非.net系统的Webservice的探索 ( 二 ) WSE
    在Sql Server 使用系统存储过程sp_rename修改表名或列名
    Who is locking the DB account?
    (python learn) 7 字典
    (python learn) 8 流程控制
    (python learn) 4 number&& string
    where is the data come from after we drop the table
    (healthy recorder) 治疗第6天
    (python learn) 6 列表
  • 原文地址:https://www.cnblogs.com/Sundial/p/11830555.html
Copyright © 2020-2023  润新知