洛谷 P4783 【模板】矩陣求逆
阿新 • • 發佈:2018-12-13
題目分析
模板題。
#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]; }