constexpr int N = 3001;
vector<bitset<N>> a(N);
//n个方程,m个未知数,p组常数项
vector<vector<bool>> guass(int n, int m, int p) {
int rank = 0;
vector<int> pivot_col(n, -1);
// 高斯消元
for (int col = 0; col < m && rank < n; ++col) {
int pivot = -1;
for (int row = rank; row < n; ++row) {
if (a[row][col]) {
pivot = row;
break;
}
}
if (pivot == -1) continue;
swap(a[rank], a[pivot]);
pivot_col[rank] = col;
for (int row = 0; row < n; ++row) {
if (row != rank && a[row][col])
a[row] ^= a[rank];
}
++rank;
}
// 检查矛盾
for (int row = rank; row < n; ++row) {
for (int j = m; j < m + p; j += 1) {
if (a[row][j]) return {}; // 无解
}
}
/*
n - rank为自由元数量
if(rank < n){
//无穷解;
}
唯一解;
*/
//还原任一解 字典序最大
vector result(m, vector<bool>(p));
for (int i = 0; i < rank; i += 1) {
for (int j = 0; j < p; j += 1) {
result[pivot_col[i]][j] = a[i][m + j];
}
}
return result;
}