高斯消元裸题。。。
方法一:暴力,O(2^n)20分
方法二:直接Gauss,加点玄学技巧搞得好的话70分
方法三:使用bitset优化,复杂度:$O(\frac{n^3}{ω})$
不会的同学看一下代码吧,跟裸Gauss差不多...只不过消元地方用异或消
真的是代码一看就懂了呢...
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<bitset> 5 #define writeln(x) write(x),puts("") 6 #define writep(x) write(x),putchar(' ') 7 using namespace std; 8 inline int read(){ 9 int ans=0,f=1;char chr=getchar(); 10 while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();} 11 while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();} 12 return ans*f; 13 }void write(int x){ 14 if(x<0) putchar('-'),x=-x; 15 if(x>9) write(x/10); 16 putchar(x%10+'0'); 17 }const int M=2005; 18 bitset<M> a[M]; 19 int n,m,ans; 20 inline void Gauss(){ 21 for(int i=1,now;i<=n;i++){now=i; 22 while(!a[now][i]&&now<=m) ++now; 23 if(now==m+1){return (void)(puts("Cannot Determine"));} 24 ans=max(ans,now); 25 if(now!=i) swap(a[now],a[i]); 26 for(int j=1;j<=m;j++) 27 if(i==j||!a[j][i]) continue; 28 else a[j]^=a[i]; 29 }writeln(ans); 30 for(int i=1;i<=n;i++){ 31 if(!a[i][n+1]) puts("Earth"); 32 else puts("?y7M#"); 33 } 34 } 35 int main(){ 36 n=read(),m=read(); 37 for(int i=1;i<=m;i++) 38 for(int j=1;j<=n+1;j++){ 39 char chr; 40 while((chr=getchar())<'0'||chr>'1'); 41 a[i][j]=chr-48; 42 }Gauss(); 43 return 0; 44 }