zoukankan      html  css  js  c++  java
  • 矩阵求逆

    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
  • 相关阅读:
    1.8(SQL学习笔记)触发器
    1.7(SQL学习笔记)游标
    1.6(SQL学习笔记)存储过程
    1.4(JavaScript学习笔记) window对象的属性及方法
    1.3 (JavaScript学习笔记)JavaScript对象
    1.2(JavaScript学习笔记)JavaScript HTML DOM
    1.1(JavaScript学习笔记)、JavaScript基础
    vuejs,router
    一个非常牛比的前端google插件
    vue.js 2.0开发(4)
  • 原文地址:https://www.cnblogs.com/Sundial/p/11830555.html
Copyright © 2011-2022 走看看