[AcWing 884] 高斯消元解异或线性方程组

image
image

复杂度 O(n3)

总体复杂度 1003=1×106


点击查看代码
#include<iostream>

using namespace std;
const int N = 110;
int n, a[N][N];

int gauss()
{
    int c, r;
    for (c = 0, r = 0; c < n; c ++) {
        int t = r;
        for (int i = r; i < n; i ++)
            if (a[i][c]) {
                t = i;
                break;
            }
        if (!a[t][c])    continue;
        for (int i = c; i <= n; i ++)   swap(a[t][i], a[r][i]);
        for (int i = r + 1; i < n; i ++)
            if (a[i][c])
                for (int j = n; j >= c; j --)
                    a[i][j] ^= a[r][j];
        r ++;
    }
    if (r < n)  {
        for (int i = r; i < n; i ++)
            if (a[i][n])
                return 2;
        return 1;
    }
    for (int i = n - 1; i >= 0; i --)
        for (int j = i + 1; j < n; j ++)
            a[i][n] ^= a[i][j] & a[j][n];
    return 0;
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < n + 1; j ++)
            cin >> a[i][j];
    int t = gauss();
    if (t == 0) {
        for (int i = 0; i < n; i ++)    printf("%d\n", a[i][n]);
    }
    else if (t == 1)    puts("Multiple sets of solutions");
    else    puts("No solution");
    return 0;
}

  1. 消成上三角矩阵;
  2. 判断解的个数:
    ① 完美的上三角矩阵:唯一解;
    ② 有矛盾:无解;
    ③ 无矛盾:多组解;
  3. 高斯消元
    枚举每一列 c (已经换过的行不动,只对未换过的行执行以下操作)
    ① 找到不为 0 的一行;(c 列中不为 0 的)
    ② 将该行换到最上面;(未换过的行中的最上面,换过的行的下面)
    ③ 将下面所有行的第 c 列清成 0;
posted @   wKingYu  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 884] 高斯消元解异或线性方程组』
点击右上角即可分享
微信分享提示