高斯消元:
几个方程,每次消去一个未知数,最后判断有解,无解,多解
cur = 1;
for (int i = 1; i <= n; i++) {
id = cur;
for (int j = cur; j <= m; j++) {
if (fabs(a[j][i]) > fabs(a[id][i]))
id = j;
}
if (fabs(a[id][i]) > 1e-10)
for (int j = i; j <= n + 1; j++) swap(a[id][j], a[cur][j]);
else
continue;
for (int j = n + 1; j >= i; j--) a[cur][j] /= a[cur][i];
for (int j = 1; j <= m; j++) {
for (int h = n + 1; h >= i; h--)
if (j != cur)
a[j][h] -= a[j][i] * a[cur][h];
}
cur++;
}
int fl = 0;
for (int i = cur; i <= m; i++) {
if (fabs(a[i][n + 1]) >= 1e-10) {
cout << "No solutions";
return 0;
}
}
for (int i = 1; i <= n; i++) {
if (fabs(a[i][i]) < 1e-10 && fabs(a[i][n + 1]) < 1e-10) {
cout << "Many solutions";
return 0;
}
}
for (int i = 1; i <= n; i++) {
cout << int(a[i][n + 1] / a[i][i] + 0.5) << endl;
}
线性基
不好说,直接放代码
建基:
void build(long long xx) {
for (int i = 50; i >= 0; i--) {
if ((xx >> i & 1) == 1) {
if (d[i] != 0)
xx = xx ^ d[i];
else {
d[i] = xx;
break;
}
}
}
}
查询第k小的位置:
void rebuild() {
for (long long i = 62; i >= 0; i--) {
for (long long j = i - 1; j >= 0; j--) {
if (p[i] & (1ll << j))
p[i] ^= p[j];
}
}
for (long long i = 0; i <= 62; i++) {
if (p[i] != 0) {
top++;
d[top] = p[i];
}
}
}
void work(long long kk) {
if (kk >= (1ll << top)) {
cout << "-1" << endl;
return;
}
anss = 0;
for (long long i = 1; i <= top; i++) {
if (kk & (1ll << (i - 1)))
anss ^= d[i];
}
cout << anss << endl;
}
查k的位置
void ist(int tmp) {
for (int i = 30; i >= 0; --i) {
if (!((1 << i) & tmp))
continue;
if (!b[i]) {
b[i] = tmp;
break;
}
tmp ^= b[i];
if (tmp == 0) {
(cnt <<= 1) %= mod;
break;
}
}
}