其他分享
首页 > 其他分享> > [AcWing 884] 高斯消元解异或线性方程组

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

作者:互联网

image
image

复杂度 $ O(n^{3}) $

总体复杂度 $ 100^{3} = 1 \times 10^{6} $


点击查看代码
#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;

标签:return,884,元解,复杂度,++,int,未换,高斯消
来源: https://www.cnblogs.com/wKingYu/p/16263543.html