首页 > 其他 > 详细

洛谷 P4783 【模板】矩阵求逆

时间:2018-12-13 10:52:31      阅读:171      评论:0      收藏:0      [点我收藏+]

题目分析

模板题。

#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];
}

洛谷 P4783 【模板】矩阵求逆

原文:https://www.cnblogs.com/Trrui/p/10112592.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!