O((nm)3)的代码居然没有超时,而且也没有使用bitset之类的优化
#include <iostream>
using namespace std;
int n,m,a[1616][1616];
int getid(int u,int v)
{
return (u-1)*m+v;
}
bool safe(int u,int v)
{
return (u>=1&&u<=n&&v>=1&&v<=m);
}
int ans[1616];
void gauss()
{
int last=getid(n,m);
for(int i=1;i<=last;i++)
{
for(int j=i;j<=n*m;j++)
if(a[j][i]>0)
{
swap(a[i],a[j]);
break;
}
if(!a[i][i])
ans[i]=1;
for(int j=i+1;j<=last;j++)
if(a[j][i]==1)
{
for(int k=1;k<=last;k++)
a[j][k]^=a[i][k];
}
}
for(int i=last;i>=1;i--)
for(int j=i+1;j<=last;j++)
ans[i]^=(ans[j]*a[i][j]);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
a[getid(i,j)][getid(i,j)]=1;
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
for(int k=1;k<=4;k++)
if(safe(i+dx[k],j+dy[k]))
a[getid(i,j)][getid(i+dx[k],j+dy[k])]=1;
}
gauss();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<ans[getid(i,j)]<<" ";
cout<<"\n";
}
return 0;
}