【模板】矩阵求逆

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

posted @ 2019-02-15 09:21  露迭月  阅读(966)  评论(0编辑  收藏  举报