线性基学习笔记

基础定义:

张成

\(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

相关文章
相关标签/搜索