//引入样式文件(页首)

线性基学习笔记

基础定义:

张成

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

题目

洛谷 P4839

洛谷 P3812

洛谷 P4570

洛谷 P3857

洛谷 P4151

洛谷 P4301

posted @ 2020-07-15 19:43  云岁月书  阅读(57)  评论(0)    收藏  举报

载入天数...载入时分秒...