线性基 高斯消元法 C++

线性基是一种数据结构,用于高效地解决一类与线性无关性有关的问题。具体而言,线性基可以用于快速求解一组非负整数线性组合的最大值、最小值,或者进行异或运算的一些操作。

线性基的基本思想是使用一个长度固定的二进制向量表示一组数的线性组合关系。通过不断向线性基中插入新的数,可以将这组数的线性组合关系表示为线性基中的若干个线性无关的向量的异或和。

#include <bits/stdc++.h>
#define ll long long
#define int long long
#define endl "\n"
#define KUI ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
const int con = 2e5 + 4;
const int N = 2e5;
const int mod = 998244353;
int n, m, k, a[60];
void gauss()
{
    for (int i = 62; i >= 0; i--)
    {
        for (int j = k; j <= n; j++)
        {
            if (a[j] >> i & 1)
            {
                swap(a[k], a[j]);
                break;
            }
        }
        if ((a[k] >> i & 1) == 0)
        {
            continue;
        }
        for (int j = 1; j <= n; j++)
        {
            if (j != k && (a[j] >> i & 1))
            {
                a[j] ^= a[k];
            }
        }
        k++;
        if (k == n + 1)
        {
            break;
        }
    }
}
void take()
{
    cin >> n;
    k = 1;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    gauss();
    ll ans = 0;
    for (int i = 1; i <= k; i++)
    {
        ans ^= a[i];
    }
    cout << ans << endl;
}
signed main()
{
    KUI;
    int t1 = 1;
    while (t1--)
    {
        take();
    }
    return 0;
}

全主元高斯消元法是一种解线性方程组的方法,它可以通过消元和回代的方式求解方程组的解。以下是一个C++实现的例子: ```c++ #include <iostream> #include <cmath> using namespace std; const int MAXN = 100; const double eps = 1e-10; class GAUS { private: int n; double a[MAXN][MAXN], b[MAXN]; int p[MAXN], q[MAXN]; public: GAUS(int n) : n(n) {} void input() { cout << "请输入系数矩阵A和常数向量B:" << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } cin >> b[i]; } } void gauss() { for (int i = 1; i <= n; i++) { p[i] = q[i] = i; } for (int k = 1; k <= n; k++) { double maxa = 0; int maxp = 0, maxq = 0; for (int i = k; i <= n; i++) { for (int j = k; j <= n; j++) { if (fabs(a[p[i]][q[j]]) > maxa) { maxa = fabs(a[p[i]][q[j]]); maxp = i; maxq = j; } } } if (maxa < eps) { cout << "矩阵奇异,无法求解!" << endl; return; } if (maxp != k) { swap(p[k], p[maxp]); } if (maxq != k) { swap(q[k], q[maxq]); } for (int i = k + 1; i <= n; i++) { double f = a[p[i]][q[k]] / a[p[k]][q[k]]; b[p[i]] -= f * b[p[k]]; for (int j = k + 1; j <= n; j++) { a[p[i]][q[j]] -= f * a[p[k]][q[j]]; } } } } void output() { cout << "方程组的解为:" << endl; for (int i = n; i >= 1; i--) { double sum = 0; for (int j = i + 1; j <= n; j++) { sum += a[p[i]][q[j]] * b[p[j]]; } b[p[i]] = (b[p[i]] - sum) / a[p[i]][q[i]]; } for (int i = 1; i <= n; i++) { cout << "x" << i << " = " << b[p[i]] << endl; } } }; int main() { GAUS c(4); c.input(); c.gauss(); c.output(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值