給定\(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...