约旦消元求逆矩阵

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long 
const int N=1e3;
const int mod=1e9+7;
double eps=1e-8;
LL a[N][N];
int n;
LL quick(LL a,LL b,LL mod){
    LL ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
int guss()
{  
    int c=1,r=1;
    for(c=1,r=1;c<=n;c++)
    {   int t=r;
     for(int i=r+1;i<=n;i++) if(abs(a[i][c])>abs(a[t][c])) t=i;
     if(!a[t][c]) continue;
     for(int i=c;i<=2*n;i++) swap(a[r][i],a[t][i]);
    LL  k=quick(a[r][c],mod-2,mod);
    for(int i=2*n;i>=c;i--) a[r][i]=(a[r][i]*k%mod+mod)%mod; 
    for(int i=r+1;i<=n;i++)
     if(a[i][c])
     { 
     for(int j=2*n;j>=c;j--) 
     a[i][j]=(a[i][j]-a[i][c]*a[r][j]%mod)%mod;    
     }  
    r++;    
    }
    if(r<n+1) return 0;
    for(int i=n-1;i>=1;i--)
    for(int j=i+1;j<=n;j++)
    if(a[i][j])
    {
     for(int k=n+1;k<=2*n;k++)
     a[i][k]=(a[i][k]-a[i][j]*a[j][k]%mod)%mod;    
    }
    return 1;
}
int main(){
 cin>>n;
 for(int i=1;i<=n;i++)
 for(int j=1;j<=n;j++)
  cin>>a[i][j];
  for(int i=n+1;i<=2*n;i++)
  a[i-n][i]=1;
   int t=guss();
  /* for(int i=1;i<=n;i++)
   {
         for(int j=1;j<=2*n;j++)
         cout<<a[i][j]<<" ";
         cout<<endl;
   }*/
   if(t==0) cout<<"No Solution"<<endl;
   else{
       for(int i=1;i<=n;i++)
 {
     for(int j=n+1;j<=2*n;j++)
     cout<<(a[i][j]%mod+mod)%mod<<" ";
     cout<<endl;
 }
   }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值