求逆矩阵模板
Posted lfri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求逆矩阵模板相关的知识,希望对你有一定的参考价值。
题目
求一个 $N \times N$ 的矩阵的逆矩阵。答案对 $10^9+7$ 取模。若不可逆,输出 "No Solution"。
分析
由线性代数的知识,求矩阵A的逆矩阵时,
只需在A的右边补充一个单位矩阵,进行初等行变换,当A变成单位矩阵时,右边的就是A的逆矩阵。
简单的证明:$AE\rightarrow EA‘$
代码
//来自https://blog.csdn.net/qq_43653202/article/details/99976316
#include<iostream> #include<cstdio> #include<cmath> #define re register #define il inline #define ll long long using namespace std; il ll read() ll s=0,f=0;char c=getchar(); while(c<‘0‘||c>‘9‘) f=(c==‘-‘),c=getchar(); while(c>=‘0‘&&c<=‘9‘) s=(s<<3)+(s<<1)+(c^‘0‘),c=getchar(); return f?-s:s; const int N=405,mod=1e9+7; int n; ll a[N][N<<1]; il ll qpow(ll x,ll k) ll ans=1; while(k) if(k&1) ans=ans*x%mod; x=x*x%mod; k>>=1; return ans%mod; il void Gauss_j() for(re int i=1,r;i<=n;++i) r=i; for(re int j=i+1;j<=n;++j) if(a[j][i]>a[r][i]) r=j; if(r!=i) swap(a[i],a[r]); if(!a[i][i])puts("No Solution");return; int kk=qpow(a[i][i],mod-2); //求逆元 for(re int k=1;k<=n;++k) if(k==i) continue; int p=a[k][i]*kk%mod; for(re int j=i;j<=(n<<1);++j) a[k][j]=((a[k][j]-p*a[i][j])%mod+mod)%mod; for(re int j=1;j<=(n<<1);++j) a[i][j]=(a[i][j]*kk%mod); //更新当前行 如果放在最后要再求一次逆元,不如直接放在这里 for(re int i=1;i<=n;++i) for(re int j=n+1;j<(n<<1);++j) printf("%lld ",a[i][j]); printf("%lld\n",a[i][n<<1]); int main() n=read(); for(re int i=1;i<=n;++i) for(re int j=1;j<=n;++j) a[i][j]=read(),a[i][i+n]=1; Gauss_j(); return 0;
以上是关于求逆矩阵模板的主要内容,如果未能解决你的问题,请参考以下文章