洛谷 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];
}
posted @ 2018-12-13 10:32  Trrui  阅读(184)  评论(0编辑  收藏  举报