P2447 [SDOI2010]外星千足虫 (高斯消元)
题目P2447 [SDOI2010]外星千足虫 解析
(0)为偶数,(1)为奇数,
若把第一个里面的奇偶数分别换成(1)和(0),则对于((x_1+x_2)bmod 2)的操作,可以看做异或操作((x_1bigoplus x_2))。 易证,((x_1+x_2+x_3+···+x_n)mod 2 = x_1bigoplus x_2bigoplus x_3 bigoplus ···bigoplus x_n)。 对于主元所在的列,我们只让主元行上的数为(1),其余的为(0),于是我们让每一行与当前主元行比较,若某一行的这个数为(1),就让这一行异或主元行。 代码#include <bits/stdc++.h> using namespace std; const int N = 2010; bitset<N> a[N]; char s[N]; int n,m,ans; template<class T>inline void read(T &x) { x = 0;int f = 0;char ch = getchar(); while(!isdigit(ch)) f |= (ch == '-'),ch = getchar(); while(isdigit(ch)) x = x * 10 + ch -'0',ch = getchar(); x = f ? -x : x; return ; } void Gauss() { for (int i = 1; i <= n; ++i) { int k = i; while (!a[k][i] && k <= m) k++; if (k == m + 1) { ans = -1; return; } ans = max(ans,k); if (k != i) swap(a[k],a[i]); for (int j = 1; j <= m; ++j) if (j != i && a[j][i]) a[j] ^= a[i]; } return; } int main() { read(n),read(m); for (int i = 1,x; i <= m; ++i) { scanf("%s",s); for (int j = 0; j < n; ++j) a[i][j + 1] = s[j] - '0'; read(x); a[i][n + 1] = x; } Gauss(); if (ans == -1) printf("Cannot Determinen"); else { printf("%dn",ans); for (int i = 1; i <= n; ++i) printf(a[i][n + 1] == 1 ? "?y7M#n" : "Earthn"); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |