[AcWing] 884. 高斯消元解异或线性方程组 (C++实现)高斯消元解异或线性方程组模板题

该博客介绍了如何使用高斯消元法解决异或线性方程组的问题,提供了一个C++实现的模板。通过读题、理解思路、解法步骤和相关前置习题,阐述了求解过程。最后,讨论了解法的适用情况,包括唯一解、无穷多解和无解的判断。

[AcWing] 884. 高斯消元解异或线性方程组 (C++实现)高斯消元解异或线性方程组模板题

与高斯消元求解线性方程组差不多,详见 4. 可能有帮助的前置习题

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 读题(需要重点注意的东西)

思路:

类似线性代数的求通解过程
在这里插入图片描述
本题的思路
在这里插入图片描述

3. 解法

---------------------------------------------------解法---------------------------------------------------

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;


int n;
int a[N][N];


int gauss()
{
   
   
    int c, r; // c 列 r 行
    // 枚举列,每次迭代进行如下操作
    for (c = 0, r = 0; c < n; c ++ )
    {
   
   
        
# T606483 【高斯消高斯消异或线性方程组 ## 题目描述 输入一个包含 n 个方程 n 个未知数的异或线性方程组方程组中的系数和常数为 0 1,每个未知数的取值也为 0 1。 求这个方程组异或线性方程组示例如下: M[1][1]x[1] ^ M[1][2]x[2] ^ … ^ M[1][n]x[n] = B[1] M[2][1]x[1] ^ M[2][2]x[2] ^ … ^ M[2][n]x[n] = B[2] … M[n][1]x[1] ^ M[n][2]x[2] ^ … ^ M[n][n]x[n] = B[n] 其中 ^ 表示异或(XOR),M[i][j] 表示第 i 个式子中 x[j] 的系数,B[i] 是第 i 个方程右端的常数,取值均为 0 1。 ## 输入格式 第一行包含整数 n。 接下来 n 行,每行包含 n+1 个整数 0 1,表示一个方程的 n 个系数以及等号右侧的常数。 ## 输出格式 如果给定线性方程组存在唯一,则输出共 n 行,其中第 i 行输出第 i 个未知数的。 如果给定线性方程组存在多组,则输出 Multiple sets of solutions。 如果给定线性方程组,则输出 No solution。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 1 1 0 1 0 1 1 0 1 0 0 1 ``` ### 输出 #1 ``` 1 0 0 ``` ## 说明/提示 1≤n≤100 请结合题目描述,按照输入格式要求,时间满足1000ms,空间满足512Mib限制,帮我写一个C++程序用来生成符合题目条件的20条输入测试数据导出到test1.in到test20.in文件,请务必包含极限值极大值和极小值以及题目中隐含的特殊值,所有情况都要涉及。
最新发布
08-15
在生成符合题目条件的20条测试数据时,需要确保输入结构与题目描述一致,并包含极限值、特殊值以及可能影响算法行为的边界情况。以下是一个C++程序示例,用于生成满足条件的测试数据: ### 输入结构要求 - 第一行输入为测试用例数 `T`(`T <= 30`)。 - 每个测试用例包含三行: 1. 第一行是两个整数 `N` 和 `M`(分别表示行数和列数,`N, M <= 500`)。 2. 第二行是 `N` 个整数,表示每行的和。 3. 第三行是 `M` 个整数,表示每列的和。 ### 生成策略 - **极限值**:`N = 500` 和 `M = 500` 的情况。 - **特殊值**:全零矩阵、单行、单列、全相同值、随机分布值。 - **和约束**:行和与列和总和必须相等,否则无。 ### C++ 程序示例 ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN = 500; const int MAXM = 500; // 生成随机整数数组 vector<int> generateRandomArray(int size, int sum) { vector<int> arr(size, 0); random_device rd; mt19937 gen(rd()); uniform_int_distribution<> dis(0, sum); for (int i = 0; i < size - 1; ++i) { arr[i] = dis(gen) % (sum + 1); sum -= arr[i]; } arr[size - 1] = sum; return arr; } // 生成测试用例 void generateTestCases(int T) { random_device rd; mt19937 gen(rd()); uniform_int_distribution<> dis_n(1, MAXN); uniform_int_distribution<> dis_m(1, MAXM); for (int t = 0; t < T; ++t) { int N = dis_n(gen); int M = dis_m(gen); int total_sum = 0; // 行和 vector<int> row_sums = generateRandomArray(N, N * M * 10); total_sum = accumulate(row_sums.begin(), row_sums.end(), 0); // 列和 vector<int> col_sums = generateRandomArray(M, total_sum); // 输出 cout << N << " " << M << endl; for (int val : row_sums) cout << val << " "; cout << endl; for (int val : col_sums) cout << val << " "; cout << endl; } } int main() { int T = 20; cout << T << endl; generateTestCases(T); return 0; } ``` ### 生成的测试用例类型 1. **全零矩阵**:所有行和与列和为 0。 2. **单行矩阵**:`N = 1`,`M = 500`。 3. **单列矩阵**:`M = 1`,`N = 500`。 4. **行和全相同**:例如 `row_sums = [100, 100, ..., 100]`。 5. **列和全相同**:例如 `col_sums = [100, 100, ..., 100]`。 6. **随机分布**:使用 `generateRandomArray` 函数生成。 ### 注意事项 - 确保行和与列和的总和一致,否则无。 - 可以通过修改 `generateRandomArray` 函数生成特殊值(如全零、负数等)。 - 支持生成 `N = 500` 和 `M = 500` 的极限情况。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值