关于高斯消元
查看原帖
关于高斯消元
32490
memory_frv楼主2021/9/23 21:55

这道题高斯消元题解都是用的辗转相除,但有些别的题目写法不一样

#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;
} 

这份代码是通过不了的,求教如何用这种写法通过本题

2021/9/23 21:55
加载中...