这道题高斯消元题解都是用的辗转相除,但有些别的题目写法不一样
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
char a[50][50];
const ll mod=1e9;
ll ans=1,id[50][50],cnt=0,n,m,Move[4]={1,0,0,-1},Move1[4]={0,1,-1,0},L[500][500];
inline void add(int x,int y){
L[x][y]--,L[y][x]--,L[x][x]++,L[y][y]++;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='.') id[i][j]=++cnt;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!='.') continue;
if(a[i+1][j]=='.') add(id[i][j],id[i+1][j]);
if(a[i][j+1]=='.') add(id[i][j],id[i][j+1]);
}
}
cnt--;
for(int i=1;i<=cnt;i++){
int mmax=i;
for(int j=i+1;j<=cnt;j++){
if(abs(L[j][i])>abs(L[mmax][i])) mmax=j;
}
if(i!=mmax) ans*=-1;
for(int j=1;j<=cnt;j++) swap(L[mmax][j],L[i][j]);
if(!L[i][i]){
cout<<"0";return 0;
}
for(int j=1;j<=n;j++){
ll temp=L[j][i]/L[i][i];
if(j==i) continue;
for(int k=i+1;k<=n;k++) L[j][k]=(L[j][k]-L[i][k]*temp%mod+mod)%mod;
}
}
for(int i=1;i<=cnt;i++) ans=(ans*L[i][i]%mod+mod)%mod;
cout<<ans;
return 0;
}
这份代码是通过不了的,求教如何用这种写法通过本题