线性基小记

性质

  • 若线性基的大小(秩)为 \(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\)

题目

posted @ 2026-05-16 15:41  huangyuze  阅读(18)  评论(0)    收藏  举报