線性基學習筆記

基礎定義:

張成

\(T\subseteq S\) ,全部這樣子集 \(T\) 的異或和組成的集合稱爲集合 \(S\) 的張成,記做 \(span(S)\) ,即從 \(S\) 中選出任意多個數,其異或和的全部可能的結果組成的集合。

線性相關

對於一個集合 \(S\) ,若是存在一個元素 \(S_i\) ,使得,\(S\) 在去除這個元素後獲得的集合 \(S^{'}\) 的張成 \(span(S^{'})\) 中包含 \(S_i\) ,即 \(S_i\in{span(S^{'})}\) ,則稱集合 \(S\) 線性相關。

更形象地,能夠表示爲,存在一個元素 \(S_i\) ,能夠用其它若干個元素異或起來獲得。

相對的,若是不存在這樣的元素 \(S_i\),則稱集合 \(S\) 線性無關。

一個顯然的結論是,對於這個線性相關的集合 \(S\) ,去除這個元素後,集合的張成不變。

線性基

咱們稱集合 \(B\) 是集合 \(S\) 的線性基,當且僅當:

1.$ S\in{span(B)} $。
2.B是線性無關的。

學習博客學習

線性基用處:用來解決異或和問題。

struct LinearBasis
{
	# define N 64
	# define reg register
	# define TT template<class T>
	# define LL long long
	
	LL base[N];
	
	TT
	inline void Insert(T x)
	{
		for(reg LL i = N-1; ~i ; --i)
			if(x & (1LL << i))//可簡化成 (x >> i) 
			{
				x ^= base[i];
				if(base[i] == 0){base[i] ^= x;return;}
			}
	}
	
	TT
	inline bool Check(T x)
	{
		for(reg int i = N-1; ~i ; --i)
			if(base[i]) x ^= base[i];
			
		return x == 0;
	}
	
	inline void Merge(LinearBasis x)
	{
		for(reg int i = N-1; ~i ; --i) if(x.base[i]) Insert(x.base[i]);
	}
	
	inline LL Xor_Sum_Max()
	{
		LL res = 0;
		
		for(reg int i = N-1; ~i ; --i) if((res ^ base[i]) > res)   res ^= base[i];
		
		return res; 
	}
	
	inline LL Xor_Sum_Min()
	{
		LL res = 0;
		
		for(reg int i = N-1; ~i ; --i) if((res ^ base[i]) < res)   res ^= base[i];
		
		return res; 
	}
	
	# undef N
	# undef reg
	# undef TT
	# undef LL 
} T;

題目

洛谷 P4839spa

洛谷 P3812code

洛谷 P4570ci

洛谷 P3857get

洛谷 P4151博客

洛谷 P4301class

相關文章
相關標籤/搜索