首页 > 编程知识 正文

高斯若尔当消元法求逆矩阵,逆矩阵高斯消元法

时间:2023-05-03 09:36:20 阅读:264144 作者:386

给出N*N的二阶矩阵,求此矩阵的逆

思路:
矩阵的初等变换,每次在该列上选择最大数(为防止矩阵无解的情况漏掉),后面的做法与初等变换完全一样
code:

#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=405;const int mod=1e9+7;ll a[N][N];ll b[N][N];inline ll read(){ ll x=0;char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))x=10*x+ch-'0',ch=getchar(); return x;}ll fast(ll x,ll y=mod-2){ ll ans=1; while(y) { if(y&1)ans=ans*x%mod; x=x*x%mod; y>>=1; } return ans;}int main(){ ll n=read(); for(int i=1;i<=n;i++) { b[i][i]=1; for(int j=1;j<=n;j++) { a[i][j]=read(); } } for(int i=1;i<=n;i++) { int r=i; for(int j=i+1;j<=n;j++) if(abs(a[j][i])>abs(a[r][i]))r=j; if(a[r][i]==0) { puts("No Solution"); return 0; } if(r!=i) { swap(a[r],a[i]); swap(b[r],b[i]); } ll div=fast(a[i][i]); a[i][i]=1; for(int j=i+1;j<=n;j++){ a[i][j]=a[i][j]*div%mod; } for(int j=1;j<=n;j++) { b[i][j]=b[i][j]*div%mod; } for(int j=i+1;j<=n;j++) { if(!a[j][i])continue; div=a[j][i]; for(int k=i;k<=n;k++) { a[j][k]=(a[j][k]-a[i][k]*div%mod+mod)%mod; } for(int k=1;k<=n;k++) { b[j][k]=(b[j][k]-b[i][k]*div%mod+mod)%mod; } } } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(a[i][j]) { ll div=a[i][j]; for(int k=j;k<=n;k++) { a[i][k]=(a[i][k]-a[j][k]*div%mod+mod)%mod; } for(int k=1;k<=n;k++) { b[i][k]=(b[i][k]-b[j][k]*div%mod+mod)%mod; } } } } for(int i=1;i<=n;i++,puts("")) for(int j=1;j<=n;j++) printf("%lld ",b[i][j]); return 0;}快三大小单双位技巧准确率99 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。