题解:
高消解异或方程组板子题。
如果消元结束后剩余方程(系数一定都为$0$)的结果不为$0$,那么无解;(但是这道题保证有解)
如果存在自由元(即消掉几个元后剩余方程内该项系数都为$0$),那么多解。
代码:
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1050; const int M = 2050; int n,m,a[M][N]; char mp[N]; bool vis[N]; int gs() { int ret = 0; for(int i=1;i<=n;i++) { int tmp = i; while(!a[tmp][i]&&tmp<=n)tmp++; if(tmp==n+1) { ret++; continue; } vis[i]=0; if(i!=tmp) for(int j=i;j<=n+1;j++)swap(a[i][j],a[tmp][j]); for(int j=i+1;j<=n;j++)if(vis[j]&&a[j][i]) for(int k=i;k<=n+1;k++) a[j][k]^=a[i][k]; } return ret; } void up() { for(int i=n;i>=1;i--) for(int j=i-1;j>=1;j--)if(a[j][i]) a[j][n+1]^=a[i][n+1]; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%s%d",mp+1,&a[i][n+1]); for(int j=1;j<=n;j++) a[i][j]=mp[j]-'0'; } for(int i=1;i<=n;i++)vis[i]=1; int now = n; while(gs()) { for(int i=1;i<=n;i++) if(vis[i]) { now++; if(now>m) { puts("Cannot Determine"); return 0; } swap(a[now],a[i]); } } up(); printf("%d ",now); for(int i=1;i<=n;i++) puts(a[i][n+1]?"?y7M#":"Earth"); return 0; }