线性基(模板) LUOGU 3812】的更多相关文章

H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这一组数求线性基,设基的长度为r,由线性代数的知识我们可以知道,在这个数组中取一个数,这个线性基有唯一一种组成方式使得异或这个数为0.所以对于不在线性基的每一个数,他可以组成的子集个数为\(2^{n-r-1}\),所以所有不构成线性基的数的贡献为\((n-r)*2^{n-r-1}\),那么对于在线性基…
题目传送门 线性基 题目描述 给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大. 输入输出格式 输入格式: 第一行一个数n,表示元素个数 接下来一行n个数 输出格式: 仅一行,表示答案. 输入输出样例 输入样例#1: 2 1 1 输出样例#1: 1 说明 $1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50}$ 分析: 一道线性基模板.<不会线性基的看这里> 直接构造线性基然后贪心选取异或得到最大答案即可. Code: #include…
解题关键:求异或最大值.线性基模板题. 极大线性无关组的概念. 异或的值域相同. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; ; ll ],a[],n; void getbase(…
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2460 题意: 给你一堆矿石,矿石有a,b两种性质,取任意个矿石,满足取得的这些矿石a性质异或和不为0,且b性质和最大,求b性质和的最大值. 思路: 线性基模板题, 根据线性基的性质: 线性基的任意一个子集异或和不为0.我们可以根据这些矿石的b性质从大到小排序,依此将这些矿石的a性质插到线性基里,如果能够插入的话就选这个,不能插入的话就不选. 实现代码: #include<bits/stdc…
题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; ; ll ],a[],n,m; //构造线性基,也可用来判断x是否存在,最后返回是否等…
题目链接:#113. 最大异或和 题目描述 这是一道模板题. 给由 \(n\) 个数组成的一个可重集 \(S\),每次给定一个数 \(k\),求一个集合 \(T \subseteq S\),使得集合 \(T\) 在 \(S\) 的所有非空子集的不同的异或和中,其异或和 \(T_1\ xor\ T_2\ xor\ ... \ xor\ T_{|T|}\) 是第 \(k\) 小的. 输入格式 第一行一个数 \(n\). 第二行 \(n\) 个数,表示集合 \(S\). 第三行一个数 \(m\),表示…
线性基是一个支持在集合里插入数并查询最大子集异或值 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<map> #include<set>…
题面 解题思路 线性基,是构造出一组数:ax,ax-1-.a1,ax的二进制最高位为x.这些数字能异或和可以表示原来所有数的异或和.其实相当于一个高斯消元的过程.所以我们按位枚举,如果这一位曾经没数,就直接加入,如果有数,我们就让这两个数异或起来,进而继续表示其他的数.要求最大值则按位贪心即可. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define L…
P3812 [模板]线性基 理解 :线性基 类似于 向量的极大无关组,就是保持原来所有数的异或值的最小集合, 求解过程也类似,可以 O( 60 * n )的复杂度求出线性基,线性基有许多性质,例如 线性基 里面的数进行异或 的值域与原来所有数异或的值域相同. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 123 ll n,a[maxn],ans,p[maxn]; void getji…
题意 给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大. \(1≤n≤50,0≤S_i≤2^{50}\) 分析 模板题. 推荐一篇好博客 现在我来证明一下线性基的性质. 性质 这说的线性基是真正的线性基,不是程序里面的. 设线性基的异或集合中不存在0. 这个是个构造,不用证明.数集T本身就是线性基,而它的异或集合中当然存在0. 线性基的异或集合中每个元素的异或方案唯一,其实这个跟性质1是等价的. 如果异或方案有多种,那么这些方案去掉公共部分后异或起来就是0,与性质1矛盾…