求调高斯消元,样例过不去
查看原帖
求调高斯消元,样例过不去
353688
王熙文楼主2023/2/1 17:20

思路是建出来矩阵之后异或消元变成一个行最简形矩阵,然后将自由元设为 1,将自由元更新每一行的主元的值。

#include<bits/stdc++.h>
using namespace std;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m;
bitset<1610> a[1610];
int ans[1610];
bool zyy[1610]; // 自由元 
int wz[1610]; // 第一个 1 
int main()
{
	cin>>n>>m;
	for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=m; ++j)
		{
			for(int k=0; k<4; ++k)
			{
				int tx=i+dx[k],ty=j+dy[k];
				if(1<=tx && tx<=n && 1<=ty && ty<=m) a[(i-1)*m+j][(tx-1)*m+ty]=1;
			}
		}
	}
	for(int pos=1,i=1; i<=n*m && pos<=n*m+1; ++pos)
	{
		int wwz=0;
		for(int j=i; j<=n*m; ++j)
		{
			if(a[j][pos]) { wwz=j; break; }
		}
		if(!wwz) { zyy[pos]=1; continue; }
		swap(a[i],a[wwz]);
		wz[i]=pos;
		for(int j=1; j<=n*m; ++j)
		{
			if(j!=i && a[j][pos]) a[j]^=a[i];
		}
		++i;
	}
	for(int i=1; i<=n*m; ++i)
	{
		for(int j=1; j<=n*m+1; ++j)
		{
			cout<<a[i][j];
		}
		cout<<'\n';
	}
	for(int i=1; i<=n*m; ++i)
	{
		if(zyy[i])
		{
			ans[i]=1;
			for(int j=1; j<=n*m; ++j)
			{
				if(wz[j] && a[j][i]) ans[wz[j]]^=1;
			}
		}
	}
	for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=m; ++j) cout<<ans[(i-1)*m+j]<<' ';
		cout<<'\n';
	}
	return 0;
}
2023/2/1 17:20
加载中...