线性基类似于线性代数中的基向量,我们找一个整数集的线性基,实际上是找这样一个集合P,使得P中的元素互相异或运算得到的结果集和原集合相等。从二进制上看,最终我们期望得到
1—–
01—
001-
这样的集合,同时也可以进一步将低位的0消去。
向原集合插入一个新数字
1 | void inst(ll a){ |
询问第K大(线性基的值域第k大)
原理从二进制上看很直观,从小到大每个基有选与不选两种选择,将K看作二进制数,选取1位置的基即可,如果线性基能产生0则将k减1。
询问第k大的时候需要你把每个线性基的低位都清除
1 | ll query(ll k){ //要求线性基已经整理成对角矩阵的形式 |
询问第k大例题:
1 |
|