根据第一行可以推出第
n
<script type="math/tex" id="MathJax-Element-121">n</script>行,然后以此列出异或方程。
然后就高斯消元解异或方程即可。
#include <bits/stdc++.h>
#define N 49
#define eps 1e-7
using namespace std;
int n,m,ans[N][N],a[N][N],b[N];
bitset<N> A[N][N],B[N];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
A[1][i][i]=1;
for (int i=2;i<=n;i++)
for (int j=1;j<=m;j++)
A[i][j]=A[i-1][j-1]^A[i-2][j]^A[i-1][j]^A[i-1][j+1];
/*for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cout<<A[i][j]<<endl;*/
for (int i=1;i<=m;i++)
B[i]=A[n-1][i]^A[n][i-1]^A[n][i]^A[n][i+1];
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++)
a[i][j]=B[i][j];
for (int i=1,j,k;i<=m;i++)
{
for (j=i;j<=m;j++) if (fabs(a[j][i])>eps) break;
if (j>m) continue;
for (k=1;k<=m+1;k++) swap(a[j][k],a[i][k]);
for (j=i+1;j<=m;j++)
if (a[j][i])
for (k=i;k<=m+1;k++) a[j][k]^=a[i][k];
}
for (int i=m;i;i--)
{
ans[1][i]=a[i][i]?a[i][m+1]:1;
if (ans[1][i])
for (int j=1;j<i;j++) a[j][m+1]^=a[j][i];
}
for (int i=2;i<=n;i++)
for (int j=1;j<=m;j++)
ans[i][j]=ans[i-1][j-1]^ans[i-2][j]^ans[i-1][j]^ans[i-1][j+1];
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
printf("%d%s",ans[i][j],j==m?"\n":" ");
return 0;
}