#include<bits/stdc++.h> #define N 2010 usingnamespace std;
bitset<N> matrix[N]; bitset<N> ans; int n;
voidout(){ cerr << "-----------------" << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n + 1; j++) { cerr << setw(5) << matrix[i][j]; } cerr << endl; } cerr << "-----------------" << endl; }
intgauss(){ int rank = 0; // 矩阵的秩 for (int c = 1, r = 1; c <= n; c++) { int t = r; for (int i = r; i <= n; i++) { if (matrix[i].test(c)) { // 找到绝对值最大的行(只要第一个系数是 1 即可) t = i; break; } } if (!matrix[t].test(c)) continue; // 跳过零行 if (t ^ r) swap(matrix[r], matrix[t]); // 交换到第一行
for (int i = 1; i <= n; i++) { // 与普通高斯消元的不同之处,对 1~n 行全部消元 if (matrix[i].test(c) && i ^ r) { // 当前行不消,零行不消 matrix[i] ^= matrix[r]; // 异或代替减法进行消元 } } r++; rank++; } if (rank < n) { // 秩小于 n,可能是无数组解、有可能无解 for (int i = rank + 1; i <= n; i++) { if (matrix[i].test(n + 1)) return0; // 存在类似于 0=k 的矛盾情况,无解 } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n + 1; j++) { if (matrix[i].test(j)) { // 无数组解,找到主元并赋值 ans[j] = matrix[i][n + 1]; break; } } } return1; } for (int i = 1; i <= n; i++) ans[i] = matrix[i][n + 1]; // 有唯一解,对角矩阵每个未知数的解就是常数项的值 return2; }