洛谷 P4783 【模板】矩阵求逆

题目分析

模板题。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int n,a[405][405],b[405][405];
int Pow(int x,int k){
    int ret=1;
    while(k){
        if(k&1)ret=(ll)ret*x%mod;
        k>>=1;x=(ll)x*x%mod;
    }
    return ret;
}
int Inv(int x){return Pow(x,mod-2);}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++)b[i][i]=1;
    for(int i=1;i<=n;i++){
        int now=i;
        while(now<=n&&!a[now][i])now++;
        if(now==n+1){puts("No Solution");return 0;}
        if(now^i)swap(a[now],a[i]),swap(b[now],b[i]);
        int inv=Inv(a[i][i]);
        for(int j=1;j<=n;j++)
            a[i][j]=(ll)a[i][j]*inv%mod,
            b[i][j]=(ll)b[i][j]*inv%mod;
        for(int j=1;j<=n;j++){
            if(j==i)continue;
            int p=(ll)a[j][i];
            for(int k=1;k<=n;k++)
                a[j][k]=(a[j][k]-(ll)a[i][k]*p%mod+mod)%mod,
                b[j][k]=(b[j][k]-(ll)b[i][k]*p%mod+mod)%mod;
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cout<<b[i][j]<<" \n"[j==n];
}

猜你喜欢

转载自www.cnblogs.com/Trrui/p/10112592.html