zoukankan      html  css  js  c++  java
  • 16.高斯消元解异或线性方程组

     

     样例解释:

     异或又叫不进位加法

    思路:

     原题样例转换为上三角矩阵后是这样

     有唯一解

    求出唯一解后,反推一遍,就可以求出所有解

    异或版的高斯消元,比普通版的高斯消元更容易。为数不多的衍生题比母题简单系列

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 110;
     4 int n;
     5 int a[N][N];
     6 int gauss() {
     7     int c, r;
     8     //c表示枚举的每一列
     9     //r表示行
    10     for (c = 0, r = 0; c < n; c++) {
    11         int t = r;
    12         for (int i = r; i < n; i++) { 
    13             if (a[i][c]) {
    14                 t = i;
    15                 break;
    16             }
    17         }
    18         if (!a[t][c]) { 
    19             continue;
    20         }
    21         for (int i = c; i <= n; i++) { //换到最上面
    22             swap(a[t][i], a[r][i]);
    23         }
    24         for (int i = r + 1; i < n; i++) { //把下面的都变为0
    25             if (a[i][c]) { 
    26                 for (int j = n; j >= c; j--) {
    27                     a[i][j] ^= a[r][j];
    28                 }
    29             }
    30         }
    31         r++;
    32     }
    33     //已经变好了
    34     if (r < n) { //如果不到n个方程,不是唯一解
    35         for (int i = r; i < n; i++) {
    36             if (a[i][n]) { //如果出现了0 = ?的情况
    37                 return 2; //无解
    38             }
    39         }
    40         return 1; //无穷多解
    41     }
    42     for (int i = n - 1; i >= 0; i--) { //最后一步,倒着把答案推出来
    43         for (int j = i + 1; j < n; j++) {
    44             a[i][n] ^= a[i][j] * a[j][n]; //*可以写成&
    45         }
    46     }
    47     return 0; //唯一解
    48 }
    49 int main() {
    50     cin >> n;
    51     for (int i = 0; i < n; i++) {
    52         for (int j = 0; j < n + 1; j++) {
    53             cin >> a[i][j];
    54         }
    55     }
    56     int t = gauss();
    57     if (t == 0) { //唯一解
    58         for (int i = 0; i < n; i++) {
    59             cout << a[i][n] << endl;
    60         }
    61     } else if (t == 1) { //无穷多解
    62         cout << "Multiple sets of solutions" << endl;
    63     } else { //无解
    64         cout << "No solution" << endl;
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    minikube国内在线部署体验
    分表与分库使用场景以及设计方式
    epool与select有什么区别
    使用ssh-keygen生成私钥和公钥
    mysql关键字冲突
    MySQL 获取当前时间戳
    平时常说的ThreadLocal,今天就彻底解决它
    mysql和mssql最大连接数
    Spring Boot实战:拦截器与过滤器
    Mysql 索引问题-日期索引使用
  • 原文地址:https://www.cnblogs.com/fx1998/p/13454027.html
Copyright © 2011-2022 走看看