高斯消元解%2意义下的方程,Bitset优化一下。
在消的过程中就能顺便把有解的第一问求出来,记录一下访问过的最大行。
#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<cstdlib> #include<bitset> #define maxn 1020 #define maxm 2020 using namespace std; inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f; } bitset<maxn>s[maxm]; char c[maxn]; int main(){ int n=read(),m=read(); for(int i=1;i<=m;++i){ scanf("%s",c+1); for(int j=1;j<=n;++j) s[i][j]=c[j]-'0'; s[i][n+1]=read(); } int cnt=0;bool flag=0; for(int i=1;i<=n;++i){ int now=0; for(int j=i;j<=m;++j) if(s[j][i]){ now=j; break; } if(now==0){ flag=1; break; } if(cnt<now) cnt=now; if(now^i) swap(s[now],s[i]); for(int j=1;j<=m;++j){ if(j==i) continue; if(s[j][i]) s[j]^=s[i]; } } if(flag){ printf("Cannot Determine"); return 0; } printf("%d ",cnt); for(int i=1;i<=n;++i){ if(s[i][n+1]) printf("?y7M# "); else printf("Earth "); } return 0; }