异或高斯消元模板

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;
}
posted @ 2025-09-04 16:32  Ke_scholar  阅读(12)  评论(0)    收藏  举报