线性基小记
性质
- 若线性基的大小(秩)为 \(k\),那么线性基可以表示 \(2^k-1\) 种非 \(0\) 数
常见问题
判断是否存在异或等于 \(0\)
这个每次加入 \(x\) 时判断 \(x\) 有没有被消完就行了
求第 \(k\) 大数
从高位往低位贪心去做,由线性基的性质我们可以直接看 \(k\) 的第 \(i\) 位和 \(\oplus_{j=i-1}^{W-1} base_j\) 的第 \(i\) 位的关系,代码好理解点
ll query(ll k){
if (k == 0) return 0;
if (k > (1ll<<cnt)-1) return -1;
ll res = 0, mc = cnt;
F_(i,W-1,0){
if (base[i]){
--mc;
if ((((k>>mc)&1) ^ ((res>>i)&1)) == 1){
res ^= base[i];
}
}
}
return res;
}
求异或等于 \(x\) 的数的方案数
设线性基的秩为 \(k\)
若 \(x = 0\),那么答案为 \(2^{n-k}-1\)
若 \(x \ne 0\),那么若线性基能表示 \(x\),答案为 \(2^{n-k}\),否则答案为 \(0\)
证明考虑 \(n-k\) 个已经能被线性基表示出来的数,从中任选一个子集,都能与线性基内的数异或得到 \(x\)

浙公网安备 33010602011771号