线性基模板
AcWing 3164. 线性基
由高到低枚举二进制的每一位
通过高斯消元化为上三角矩阵
后将所有元素异或即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
signed main() {
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> a[i];
int k = 0;
for (int i = 62; i >= 0; i -- ) {
for (int j = k; j < n; j ++ ) {
if (a[j] >> i & 1) {
swap(a[j], a[k]);
break;
}
}
if (!(a[k] >> i & 1)) continue;
for (int j = 0; j < n; j ++ )
if (j != k && (a[j] >> i & 1))
a[j] ^= a[k];
k ++;
if (k == n) break;
}
int res = 0;
for (int i = 0; i < k; i ++ ) res ^= a[i];
cout << res << endl;
return 0;
}
AcWing 210. 异或运算
本题是上面一题的扩展,需要求第小的数
先计算线性基
将得到的x个线性基的基底看作二进制的每一位,得到k的二进制表示
(注意判断得到的线性基是线性相关的还是线性无关的)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int T, n, m;
int a[N];
signed main() {
scanf("%lld", &T);
for (int o = 1; o <= T; o ++ ) {
scanf("%lld", &n);
for (int i = 0; i < n; i ++ ) scanf("%lld", &a[i]);
int k = 0;
for (int i = 62; i >= 0; i -- ) {
for (int j = k; j < n; j ++ ) {
if (a[j] >> i & 1) {
swap(a[j], a[k]);
break;
}
}
if (!(a[k] >> i & 1)) continue;
for (int j = 0; j < n; j ++ )
if (j != k && (a[j] >> i & 1))
a[j] ^= a[k];
k ++;
if (k == n) break;
}
reverse(a, a + k);
printf("Case #%d:\n", o);
scanf("%lld", &m);
while (m -- ) {
int x;
scanf("%lld", &x);
if (k < n) x --;
if (x >= (1LL << k)) puts("-1");
else {
int res = 0;
for(int i = 0; i < k; i ++ )
if (x >> i & 1)
res ^= a[i];
printf("%lld\n", res);
}
}
}
return 0;
}
分类:
acm / 线性基
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】