【bzoj3503】[Cqoi2014]和谐矩阵

xiaoxiao2021-02-28  78

根据第一行可以推出第 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; }
转载请注明原文地址: https://www.6miu.com/read-72340.html

最新回复(0)