#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int N = 205;
ll qpow(ll a, ll b)
{
ll ans = 1;
while(b){
if(b & 1)
ans = (ans*a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ans;
}
ll inv(ll a)
{
return qpow(a, mod-2);
}
int n;
ll ar[N][N], b[N][N], det; //b是ar的逆
void solve(int n)
{
memset(b, 0, sizeof(b));
for(int i = 1; i <= n; ++i)
b[i][i] = 1;
det = 1;
for(int i = 1; i <= n; ++i){
int k;
for(k = i; k <= n; ++k){
if(ar[k][i])
break;
}
if(k != i)
det = det*(mod-1)%mod;
for(int j = 1; j <= n; ++j){
swap(ar[i][j], ar[k][j]);
swap(b[i][j], b[k][j]);
}
det = (det * ar[i][i] % mod + mod) % mod;
ll in = inv(ar[i][i]);
for(int j = 1; j <= n; ++j){
ar[i][j] = in * ar[i][j] % mod;
b[i][j] = in * b[i][j] % mod;
}
for(int k = 1; k <= n; ++k){
if(k == i)
continue;
ll tmp = ar[k][i];
for(int j = 1; j <= n; ++j){
ar[k][j] = (ar[k][j] - ar[i][j] * tmp % mod + mod) % mod;
b[k][j] = (b[k][j] - b[i][j] * tmp % mod + mod) % mod;
}
}
}
det = (det + mod) % mod;
for(int i = 1; i <= n; ++i){//这里是求伴随矩阵
for(int j = 1; j <= n; ++j){
b[i][j] = det * b[i][j] % mod;
}
}
}
int main()
{
while(scanf("%d", &n) != EOF){
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%lld", &ar[i][j]);
solve(n);
bool f = 0;
for(int i = n; i >= 1; --i){//这里求秩
for(int j = 1; j <= n; ++j){
if(ar[i][j]){
f = 1;
break;
}
}
if(!f)
n--;
}
cout << n << '\n';//n就是秩
cout << det << '\n';//这是行列式的值
}
return 0;
}
高斯消元模板
最新推荐文章于 2024-08-11 18:02:00 发布