1 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef bitset<105> bt; const int N=110; int n, m, top, ans[N][N]; bool f[N][N*N]; bt mp[N], a[N], b[N], st[N], h[N][N*N]; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-') f=-1; ch=getchar();} while(ch>='0' && ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } void insert(bt x) { for(int i=1;i<=n;i++) if(x[i]) { if(b[i].none()) {b[i]=x; return ;} x^=b[i]; } } void build() { top=0; for(int i=n;i>=1;i--) if(!b[i].none()) for(int j=1;j<=i-1;j++) if(b[j][i]) b[j]^=b[i]; for(int i=1;i<=n;i++) if(b[i].none()) { bt tp; tp[i]=1; for(int j=1;j<=n;j++) if(b[j][i]) tp[j]=1; st[++top]=tp; } } void DP(int x) { int v[N]; memset(v, 0, sizeof(v)); for(int i=0;i<=(1<<top)-1;i++) { bt tp; for(int j=1;j<=top;j++) if(i&(1<<j-1)) tp^=st[i]; int c=tp.count(); if(v[c]) continue; v[c]=1; for(int j=c;j<=m;j++) if(!f[x][j]&&f[x-1][j-c]) f[x][j]=1, h[x][j]=tp; } } void solve(int x) { for(int i=1;i<=n;i++) a[i]=mp[i]; for(int i=1;i<=n;i++) a[i][i]=mp[i][i]^mp[i][x]; for(int i=1;i<=n;i++) b[i].reset(); for(int i=1;i<=n;i++) insert(a[i]); build(); DP(x); } int main() { scanf("%d%d", &n, &m); f[0][0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[i][j]=read(); for(int i=1;i<=n;i++) solve(i); if(!f[n][m]) {puts("-1"); return 0;} puts("1"); int x=m; for(int i=n;i>=1;i--) { bt c=h[i][x]; int k=c.count(); for(int j=1;j<=n;j++) if(c[j]) ans[i][j]=1; x-=k; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d ", ans[j][i]); puts(""); } return 0; }
- 1
信息
- ID
- 7672
- 时间
- 10000ms
- 内存
- 8MiB
- 难度
- 10
- 标签
- 递交数
- 9
- 已通过
- 2
- 上传者