高斯消元解:多元一次方程,多元异或方程
Posted 一只特立独行的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高斯消元解:多元一次方程,多元异或方程相关的知识,希望对你有一定的参考价值。
多元一次方程
模板题:
多元一次方程
线性代数解多元一次方程,一个小bug卡了半天。。。
思路:
1.在一列中找到绝对值最大的数
2.将该行换到最上面
3.将该行第一个元素变成1
4.消去剩下行的第一个数
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
const double eps = 1e-6;
double arr[105][105];
int n;
// void debug() {
// for (int i = 0; i < n; i++) {
// for (int j = 0; j <= n; j++) {
// cout << arr[i][j] << " ";
// }
// cout << endl;
// }
// }
int gaoss() {
int c, r;
for (c = 0, r = 0; c < n; c++) {
int t = r;
for (int i = r; i < n; i++) {//找到最大的一行
if (fabs(arr[i][c]) > fabs(arr[t][c]))
t = i;
}
if (fabs(arr[t][c]) <= eps) continue;//这一行不算入秩
for (int i = c; i <= n; i++) swap(arr[r][i], arr[t][i]);//将最大值换到最上面
for (int i = n; i >= c; i--)arr[r][i] /= arr[r][c]; //把最大行的第一个数变成1
for (int i = r + 1; i < n; i++) {
if (fabs(arr[i][c]) > eps) {//头值非零
for (int j = n; j >= c; j--) {
arr[i][j] -= arr[i][c] * arr[r][j];
}
}
}
r++;
}//行阶梯式转换完成
// debug();
if (r < n) {
for (int i = r; i < n; i++) {
// cout<<arr[i][n]<<endl;
if (fabs(arr[i][n]) > eps) {
return 2;
}
}
return 1;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
arr[i][n] -= arr[i][j] * arr[j][n];
}
}
return 0;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n + 1; j++) {
scanf("%lf", &arr[i][j]);
}
}
int t = gaoss();
if (t == 0) {
for (int i = 0; i < n; i++)
printf("%.2f\\n", arr[i][n]);
}
else if (t == 1) {
cout << "Infinite group solutions" << endl;
}
else {
cout << "No solution" << endl;
}
return 0;
}
多元异或方程:
思路同上
x^y=z解x的方法是:x^y^y=z^y
−
−
>
-->
−−>x=z^y
多元异或方程
代码:
#include<iostream>
using namespace std;
const int N = 1e2 + 5;
int arr[N][N];
int n;
int gauss() {
int c, r;
for (c = r = 0; c < n; c++) {
//化上三角
int t = r;
for (int i = r; i < n; i++) {
if (arr[i][c] > arr[t][c]) t = i;
}
if (arr[t][c] == 0) continue;
for (int i = c; i < n + 1; i++)swap(arr[r][i], arr[t][i]);
for (int i = r + 1; i < n; i++) {
if (arr[i][c]) {
for (int j = c; j < n + 1; j++) {
arr[i][j] ^= arr[r][j] ;
}
}
}
r++;
}
if (r < n) {
for (int i = r; i < n; i++) {
if (arr[i][n] != 0)
return 2;
}
return 1;
}
for (int i = n - 1; i >= 0; i--) {
//化单位矩阵
for (int j = i + 1; j < n; j++) {
arr[i][n] ^= arr[i][j] * arr[j][n];
}
}
return 0;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n + 1; j++) {
cin >> arr[i][j];
}
}
int k = gauss();
if (k == 0) {
for (int i = 0; i < n; i++) {
cout << arr[i][n] << endl;
}
}
else if (k == 1) {
cout << "Multiple sets of solutions" << endl;
}
else {
cout << "No solution" << endl;
}
return 0;
}
以上是关于高斯消元解:多元一次方程,多元异或方程的主要内容,如果未能解决你的问题,请参考以下文章
bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)