【洛谷P2447】[SDOI2010]外星千足虫
外星千足虫
首先,它一看题解就是个高斯消元
只是改成了奇偶性的判断
性质:
奇数+奇数=偶数
奇数+偶数=奇数
偶数+奇数=奇数
偶数+偶数=偶数
于是我们用1表示奇数,0表示偶数
1+1=0
1+0=1
0+1=1
0+0=0
这个"+"好像可以换成"^" 。。。
于是开始搞死高斯消元
1 // luogu-judger-enable-o2 2 #pragma GCC optimize ("O3") 3 #include<iostream> 4 #include<cstdio> 5 #include<bitset> 6 using namespace std; 7 int n,m,R; 8 bitset<10010> a[20010],ans; 9 char s[10010]; 10 inline void read(int line) 11 { 12 scanf("%s",s); 13 for(int i=1;i<=n;i++) 14 a[line][i]=s[i-1]-'0'; 15 getchar(); 16 char c=getchar(); 17 a[line][n+1]=c-'0'; 18 } 19 inline bool Gauss() //高斯消元模板 20 { 21 for(register int i=1;i<=n;i++) 22 { 23 int j=i; 24 while(!a[j][i]&&j<=m) j++; //向下找到为1的一行 25 if(j==m+1) return 0; 26 R=max(j,R); //需要用到的行的最大行号 27 if(i!=j) swap(a[i],a[j]); 28 for(register int j=i+1;j<=m;j++) //消元,将矩阵变换为上三角矩阵 29 if(a[j][i]&&i!=j) a[j]^=a[i]; 30 // for(int k=1;k<=m;k++,puts("")) 31 // for(int l=1;l<=n+1;l++) 32 // cout<<a[k][l]<<' '; 33 // puts(""); 34 } 35 return 1; 36 } 37 int main() 38 { 39 scanf("%d%d",&n,&m); 40 for(int i=1;i<=m;i++) read(i); 41 if(Gauss()) 42 { 43 printf("%d\n",R); 44 for(register int i=n;i>=1;i--) //回代 45 { 46 ans[i]=a[i][n+1]; 47 for(register int j=i+1;j<=n;j++) 48 if(a[i][j]&&ans[j]) ans[i]=!ans[i]; //只有奇数对当前答案产生影响 49 } 50 for(register int i=1;i<=n;i++) 51 if(ans[i]) puts("?y7M#"); 52 else puts("Earth"); 53 } 54 else puts("Cannot Determine"); 55 return 0; 56 }