浮点数高斯消元
int cur = 0;
for (int i = 0; i < n; ++i) {
int p = cur;
for (int j = cur + 1; j < n; ++j)
if (abs(M[j][i]) > abs(M[p][i]))
p = j;
if (abs(M[p][i]) < EPS)
continue;
if (p != cur)
for (int j = i; j <= n; ++j)
swap(M[p][j], M[cur][j]);
for (int j = n; j >= i; --j)
M[cur][j] /= M[cur][i];
for (int j = 0; j < n; ++j)
if (j != cur)
for (int k = n; k >= i; --k)
M[j][k] -= M[j][i] * M[cur][k];
++cur;
}
if (cur < n) {
for (int i = cur; i < n; ++i)
if (abs(M[i][n]) > EPS)
return cout << -1 << '\n', 0;
return cout << 0 << '\n', 0;
}
for (int i = 0; i < n; ++i)
cout << "x" << i + 1 << "=" << M[i][n] << '\n';
线性基
struct basis {
uint64_t p[64];
basis() { memset(p, 0, sizeof(p)); }
void insert(uint64_t x) {
for (size_t i = 63; ~i; --i) {
if (!(x >> i))
continue;
if (!p[i]) {
p[i] = x;
break;
}
x ^= p[i];
}
}
uint64_t query_max(uint64_t x = 0) {
uint64_t res = x;
for (size_t i = 63; ~i; --i)
res = max(res, res ^ p[i]);
return res;
}
};