[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i]) swap(a[i],a[j]); if (!a[i]) {k=i-1; break;} D(j,30,0) if (a[i]>>j & 1){ b[i]=j; F(x,1,n) if (x!=i && a[x]>>j&1) a[x]^=a[i];…
就是我代码里读入之后的那一部分. 1.(一下a[]为原数组 a'[]为线性基) 线性基 中的a'[i]其实 是 原来的a[]中的某个子集(2^n个子集中的某个) 异或出来的  可能会有其他的子集与它异或和相同,a'[i]代表了 这个集合. 线性基的大小是log的,因为  a[]中异或和等于a'[i]的集合可能有好多   而线性基则 通过异或消掉了这些 重复的. 2. 假设a[]大小为n  线性基大小为k,则a[]和a'[] 都有且仅有2^k种 异或和不同 的子集[清楚线性基定义的话 这是显然的]…
题目链接 传送门 题意 初始时有\(n\)个数,现在有\(q\)次操作: 查询\([l,r]\)内选择一些数使得异或和最大: 在末尾加入一个数. 题目强制在线. 思路 对于\(i\)我们记录\([1,i]\)每个基底最靠近\(i\)的位置和这个位置的值,然后查询时看\(r\)这个位置记录的每个基底的位置是否大于等于\(l\),如果大于等于那么\([l,r]\)内一定有一个位置可以贡献这个基底,然后比较答案大小即可. 本题和\(cf1100F\)一样的写法只是多了个操作而已. 代码实现如下 #in…
题意:给定数组,求所有异或起来为0的集和的大小之和. 思路:由于是集合大小,我们换成考虑每个元素在多少个集合里有贡献. 先生成线性基. 对于没有插入线性基的元素x,贡献是2^(N-base-1),因为x选择之后,其他非基元素无论选还是不选,都可以调整基来使得异或和为0. 对于插入线性基的元素x,我们也同样这样考虑,把除了它的N-1个数生成线性基. 就可以同样算贡献了. 这里现在可以稍加优化,把最开始的非基元素预处理成一个线性基,这样生成新的线性基就快起来了. #include<bits/stdc…
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x个是谁 求出线性基后我们知道一共有$2^r$个不同的数,再知道每个数出现了几次就好啦 每个数出现了$2^{n-r}$次....因为有$n-r$个线性相关(高斯消元后全0了)的方程异或不影响.... 然后就简单了,从高到低枚举二进制位,异或这一位后小于k就加上 #include <iostream>…
2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 1134  Solved: 481[Submit][Status][Discuss] Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2^S定义为S 所有子 集构成的集合.定义映射 f : 2^S -> Zf(空集) = 0f(T) = XOR A[t] , 对于一切…
LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异或值,对于这个要求有个思想和概念很适用这类题——线性基.线代里面学过线性无关组,可用高斯消元解得,在本题中的线性基类似,是能够构造所有出现异或值得线性无关组.总的来说本质思维就是高斯消元. /** @Date : 2017-07-03 10:40:20 * @FileName: bzoj 2844…
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 给定集合$S$,现在将任意$A\subseteq S$中的元素求异或和,然后存入一个数组中(下标从1开始),然后从小到大排一个序.问$q$第一次出现在$A$中的下标. 我们可以通过线性基得到值域上有多少个异或和比$q$小,现在问题来了,怎么求$q$的下标. 通过打表找规律,以及手动枚举可以发现一个结论. 定理1 设线性基为$B$,那么在$S$的子集的异或和中,出现的异或和的出现的次数是$2^{\left | S \ri…
CF895C: Square Subsets && [BZOJ2844]albus就是要第一个出场 这两道题很类似,都是线性基的计数问题,解题的核心思想也一样. CF895C Square Subsets 题目链接 题意 给定\(n\)个数,求多少种选数方案使得选出来的数乘积为完全平方数.\(n\leq 100000,a_i\leq70\). 完全平方数的本质就是每个质因子的次数为偶数. 所以我们将每一个数唯一分解,然后记录每个质因子的奇偶状态,就得到了一个个01串.问题就变成了有多少个集…
2844: albus就是要第一个出场 链接 分析: 和HDU3949差不多互逆,这里需要加上相同的数. 结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大小. 结论:集合中所有异或值为0的集合有$2^{n-cnt}$个(包括空集). 证明及详细过程参考:https://blog.sengxian.com/algorithms/linear-basis,https://blog.csdn.net/jaihk662/article/details/786…