【模板】矩陣求逆


P4783 【模板】矩陣求逆

題目描述

求一個\(N\times N\)的矩陣的逆矩陣。答案對\(10^9+7\)取模。


在原矩陣右邊接一個單位矩陣,然后把原矩陣通過初等變換消成單位矩陣,右邊的單位矩陣做同樣的變換,就成了逆矩陣。

什么,為什么?

難得你不覺得這個想起來非常的正確么


Code:

// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#include <cctype>
const int mod=1e9+7;
const int N=810;
int n,a[N][N];
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
#define mul(a,b) (1ll*(a)*(b)%mod)
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
int read()
{
    int x=0;char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    return x;
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            a[i][j]=read();
        a[i][i+n]=1;
    }
    for(int i=1;i<=n;i++)
    {
        int id=-1;
        for(int j=i;j<=n;j++) if(a[j][i]) {id=j;break;}
        if(id==-1) return puts("No Solution"),0;
        std::swap(a[i],a[id]);
        int inv=qp(a[i][i],mod-2);
        for(int j=i;j<=n<<1;j++) a[i][j]=mul(a[i][j],inv);
        for(int j=i+1;j<=n;j++)
            for(int k=n<<1;k>=i;k--)
                a[j][k]=add(a[j][k],mod-mul(a[i][k],a[j][i]));
    }
    for(int i=n;i;i--)
        for(int j=i-1;j;j--)
            for(int k=n<<1;k>=i;k--)
                a[j][k]=add(a[j][k],mod-mul(a[i][k],a[j][i]));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            printf("%d ",a[i][j+n]);
        puts("");
    }
    return 0;
}


2019.2.15


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM