線性基 學習筆記

2021-10-16 21:23:42 字數 3094 閱讀 7156

按位計算,如果相同記為0,不同記為1。

如果,a⊕b=c, c⊕b=a

交換律結合律

對於任何數, x⊕x=0,x⊕0=x

對 於一

段序列a

n,異或

和為a1

⊕a2⊕

...⊕

an

對於一段序列a_n,異或和為a_1⊕a_2⊕...⊕a_n

對於一段序列

an​,

異或和為

a1​⊕

a2​⊕

...⊕

an​設t⊂

s,所有

這樣的子

集t的異

或和組成

的集合稱

為集合s

的張成,

記作sp

an(s

)。即,

在s中選

出任意多

個數,其

異或和的

所有可能

的結果組

成的集合

。設t\subset s ,所有這樣的子集 t的異或和組成的集合稱為集合 s的張成,記作 span(s)。即,在s中選出任意多個數,其異或和的所有可能的結果組成的集合。

設t⊂s,所

有這樣的

子集t的

異或和組

成的集合

稱為集合

s的張成

,記作s

pan(

s)。即

,在s中

選出任意

多個數,

其異或和

的所有可

能的結果

組成的集

合。對 於s

j⊂s,

如果去掉

sj後的

張成不變

,就稱為

線性相關

的對於s_j\subset s,如果去掉s_j後的張成不變,就稱為線性相關的

對於sj​⊂

s,如果

去掉sj

​後的張

成不變,

就稱為線

性相關的

我們稱集合b是集合 s的線性基,當且僅當:

s∈span(b),即s是b的張成的子集;

是線性無關的。

集合 b中元素的個數,稱為線性基的長度。

線性基有以下基本性質:

1.b是極小的滿足線性基性質的集合,它的任何真子集都不可能是線性基;

2.s中的任意元素都可以唯一表示為 中若干個元素異或起來的結果。

我們想把線性基構造成形如:這樣的線性基,在對角線上有1,即在主元位置上有1,

[ 10

0001

0000

1000

01

]\left[ \begin 1&0&0 &0\\ 0&1 &0&0\\ 0&0&1 &0\\ 0& 0 &0&1\\ \end \right]

⎣⎢⎢⎡​1

000​

0100

​001

0​00

01​⎦

⎥⎥⎤​

1.列舉x的所有為1的二進位制 j:l->0

2.如果a

ja_j

aj​!=0 將x的這一位消掉,x^=a

ja_j

aj​3.如果a

ja_j

aj​=0,將j之後的所有在主元位置上的1去掉,將l->j之前的在j位置的1去掉。

bool

ins(ll x)

else

b[j]

=x;return1;

}}return0;

}

通過這個方法就可以得到在主元位置有1的線性基。

1.洛谷p3812 線性基模板,xor最大值

#include

using

namespace std;

typedef

long

long ll;

const

int n=

100;

ll b[n]

;int l=

0,n;

bool

ins(ll x)

else

b[j]

=x;return1;

}}return0;

}int

main()

ll ans=0;

for(

int i=l;i>=

0;i--

) ans^

=b[i]

;printf

("%lld\n"

,ans)

;return0;

}

2.hdu3949 第k小

#include

using

namespace std;

typedef

long

long ll;

ll b[

200]

,v[200];

//b為構造的線性基,v為整理後的線性基

int t,l;

int n,m,cnt;

bool

ins(ll x)

else

b[j]

=x;return1;

}}return0;

}ll find_kth

(ll x)

return ans;

}int

main()

for(

int i=

0;i<=l;i++)if

(b[i]

) v[cnt++

]=b[i]

;//從低到高

scanf

("%d"

,&m)

;printf

("case #%d:\n"

,cas)

;for

(int i=

1;i<=m;i++)}

return0;

}

3.洛谷p4570

4.acwing 229

5.acwing 210

6.tjoi2008 彩燈

推薦這位dalao的講解

線性基學習筆記

線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...

線性基 學習筆記

includeusing namespace std using ll long long const int maxn 5e5 5 原來的數 const int maxbit 63 ll a maxn 原來的數 ll p maxbit p j 第j位為最高位1的數 最高位1在第j位的數 int m...

線性基學習筆記

線性基是乙個數的集 合數的集合 數的集合 並且每個序列都擁有至少一 個線性基 至少乙個線性基 至少乙個線性 基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。1.原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到 2.線性基裡面的任意一些數異或起來都不能得到0 3.線性基裡面的數的個...