275 words
1 minute
Linear_Algebra
2025-11-28

线性代数部分#

别问为什么不在数学部分

线性基#

其中cntcnt表示基的大小

插入操作#

从高位到最低位贪心即可

bool insert(int x){
for (int i=30;i>=0;i--){
if (x>>i&1){
if (!val[i]){
val[i]=x;cnt++;
return 1;
}
x^=val[i];
}
}
return 0;
}

求第k小#

kk二进制拆分,按位取就可以(00的情况需要特判,这里只是计算目前基的第kk小)

int qry_kth(int k){
int ans=0,ct=1<<cnt;
for (int i=30;i>=0;i--){
if (val[i]){
if (k>(ct>>=1)){
k-=ct;
if (~ans>>i&1)ans^=val[i];
}
else if (ans>>i&1)ans^=val[i];
}
}
return ans;
}

求x的排名#

这里我们计算小于等于xx的数的个数,首先需要记录一个异或和prepre,就是所选的valival_{i}的异或和。 从大到小枚举每一位,我们知道,valival_{i}有值的地方的11一定能取到,我们可以维护prepre使得取到这些位置上的11,对于vali=0val_{i}=0的位置,如果xxprepre不同时,说明我们知道所求位置了,判断一下是谁有11就可以了。

int qry_rk(int x){
int ans=0,ct=(1<<cnt),pre=0;x++;
for (int i=30;i>=0;i--){
if (val[i]){
ans+=(x>>i&1)*(ct>>=1);
if ((x^pre)>>i&1)pre^=val[i];
}
else if ((x^pre)>>i&1){
if (x>>i&1)ans+=ct;
break;
}
}
return ans;
}
Linear_Algebra
https://fuwari.vercel.app/posts/linear_algebra/
Author
Ender子浪
Published at
2025-11-28
License
CC BY-NC-SA 4.0