题解
矩阵求逆 —— 初等变换法(高斯-约旦消元)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 10 ;
const int mod = 1e9 + 7 ;
ll qpow ( ll a, ll b) {
a % = mod;
ll res = 1 ;
while ( b) {
if ( b & 1 ) res = res * a % mod;
b >>= 1 ;
a = a * a % mod;
}
return res;
}
struct Mat {
int n;
ll mat[ N] [ N << 1 ] ;
void read ( ) {
cin >> n;
for ( int i = 1 ; i <= n; ++ i) {
for ( int j = 1 ; j <= n; ++ j) {
cin >> mat[ i] [ j] ;
mat[ i] [ i + n] = 1 ;
}
}
}
void inv ( ) {
for ( int i = 1 , row; i <= n; ++ i) {
row = i;
for ( int j = i + 1 ; j <= n; ++ j) {
if ( mat[ j] [ i] > mat[ row] [ i] ) row = j;
}
if ( row != i)
swap ( mat[ i] , mat[ row] ) ;
if ( ! mat[ i] [ i] ) {
cout << "No Solution" << endl;
exit ( 0 ) ;
}
int Inv = qpow ( mat[ i] [ i] , mod - 2 ) ;
for ( int k = 1 ; k <= n; ++ k) {
if ( k == i) continue ;
int tmp = mat[ k] [ i] * Inv % mod;
for ( int j = i; j <= ( n << 1 ) ; ++ j) {
mat[ k] [ j] = ( ( mat[ k] [ j] - tmp * mat[ i] [ j] ) % mod + mod) % mod;
}
}
for ( int j = 1 ; j <= ( n << 1 ) ; ++ j) {
mat[ i] [ j] = mat[ i] [ j] * Inv % mod;
}
}
for ( int i = 1 ; i <= n; ++ i) {
for ( int j = n + 1 ; j <= ( n << 1 ) ; ++ j) {
cout << mat[ i] [ j] << ' ' ;
}
cout << endl;
}
}
} A;
int main ( ) {
ios:: sync_with_stdio ( 0 ) ;
A. read ( ) ;
A. inv ( ) ;
return 0 ;
}