hdu 3949 XOR 線性基 第k小異或和

2022-05-11 16:51:13 字數 1369 閱讀 7147

給定\(n\)個數,對其每乙個子集計算異或和,求第\(k\)小的異或和。

先求得線性基。

同上題,轉化為求其線性基的子集的第k小異或和

記\(n\)個數的線性基為向量組\(b=\(有b_i[p_i]=1,p_1\lt p_2\lt ...\lt p_t)\),記\(k\)的二進位制表示為向量\(\vec\).

則第\(k\)小異或和為$$\oplus_[i]=1}b_i$$

即\(k\)的二進位制表示中為\(1\)的那些位所對應的線性基中的向量異或起來的值。

對於任意的\(1\leq i\lt j\leq tot(tot\)為子集的總個數,也即異或和的總個數)

記\(i\)的二進位制表示為\(\vec\),\(j\)的二進位制表示為\(\vec\),設從高到低的\(\vec\)與\(\vec\)第乙個不同的位為第\(pos\)位,因為\(i\lt j\),故有\(\vec[pos]=0, \vec[pos]=1\).

記第\(i\)小異或值為\(ii\),第\(j\)小異或值為\(jj\),對應的向量分別為\(\vec, \vec\). 根據上述構造第\(k\)小值的方法,構造\(\vec\)時沒有異或\(b_\),而構造\(\vec\)時異或了\(b_\). 又由線性基的性質,只有\(b_[p_]=1\),故有\(\vec[p_]=0, \vec[p_]=1\).

即\(\vec\)與\(\vec\)高位都相同,第\(p_\)位\(\vec\)大,故\(\vec\lt \vec\),即\(ii\lt jj\).

所以\(i\lt j\rightarrow ii\lt jj\),所以\(rank(i)=rank(ii)\),得到了一一對應的關係,故構造的正確性得證。

如果原\(n\)個數表示成的\(01\)串線性相關,那麼除了可以用線性基線性組合而得的\(2^r-1\)個數外,另有最小的異或和為\(0\).

#include #define maxl 60

#define ll long long

using namespace std;

struct linearbasis

void insert(ll t)

}rel = true;

}void basis()

ll kth(ll x)

};int kas;

void work()

lb.basis();

scanf("%d", &q);

printf("case #%d:\n", ++kas);

ll tot = (1ll << lb.sz) - 1;

for (int i = 0; i < q; ++i)

}int main()

hdu3949 XOR 線性基求xor第k小

題目大意 求xor所有值的第k小,線性基模板題。include include include include include include using namespace std typedef long long ll const int max base 63 ll base 64 a 10...

線性基 HDU3949 XOR 題解

給出 n n 個數,求選出的非空集合中異或和第 k role presentation k k小的異或和 異或和相同算一次 沒有 k k 個輸出 1 role presentation 1 1。如果構造線性基時將矩陣消成對角矩陣,得到的線性基就有乙個很棒的性質 最高位為 i i 的數至多只有乙個,且...

HDU 3949 XOR 線性基 高斯消元

hdu 3949 xor hdu3949xor 搞死消元找到一組線性無關組 消出對角矩陣後 對於k二進位制拆分 對於每列只有有乙個1的,顯然可以用k的二進位制數直接異或得到第k大 對於一列由多個1的,由於二進位制性質,由於2的冪 1次方比2的 1到冪 的和要大,所以不影響大小 include inc...