hdu 3949 XOR 线性基 第k小异或和】的更多相关文章

题目链接 题意 给定\(n\)个数,对其每一个子集计算异或和,求第\(k\)小的异或和. 思路 先求得线性基. 同上题,转化为求其线性基的子集的第k小异或和. 结论 记\(n\)个数的线性基为向量组\(B=\{b_0,b_1,b_2,...,b_t\}(有b_i[p_i]=1,p_1\lt p_2\lt ...\lt p_t)\),记\(k\)的二进制表示为向量\(\vec{K}\). 则第\(k\)小异或和为\[\oplus_{\vec{K}[i]=1}b_i\] 即\(k\)的二进制表示中为…
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题目中可以出现异或和为0的情况,但线性基里是不会出现异或和为0的情况,所以我们需要多处理下,将数字全插入到线性基中,如果无法插入也就代表会出现异或和为0的情况,那么求第k小就应该变成求线性基中第k-1小. 实现代码: #include<bits/stdc++.h> using namespace s…
目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数直接异或得到第k大 对于一列由多个1的,由于二进制性质,由于2的幂+1次方比2的(1到幂)的和要大,所以不影响大小 代码 #include<queue> #include<cstdio> #include<cstring> #include<algorithm>…
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不同的地方是要缩一下位使得k的每一位都有线性基(毕竟是组合为基础的). 要在往里塞线性基的时候把每个线性基上的1能往后放的尽量往后放emmm这么搞非常重要,以后写线性基都加一下这个可以处理的东西更多了. (这个东西维护之后,线性基中所有数都变为二进制的话那么每个二进制位上至多有一个1) 这道题不能取空…
Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A XOR B, then for each bit of C, we can get its value by check the digit of corresponding position in A and B. And for each digit,…
题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一组基线性基,然后按\(k\)的二进制找地k小.因为线性基不保存0,所以对有0的情况要进行特判. 代码: #include<map> #include<set> #include<cmath> #include<cstdio> #include<stack&…
[题目分析] 异或空间的K小值. 高斯消元和动态维护线形基两种方法都试了试. 动态维护更好些,也更快(QAQ,我要高斯消元有何用) 高斯消元可以用来开拓视野. 注意0和-1的情况 [代码] 高斯消元 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 10005 #define ll lo…
HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A XOR B, then for each bit of C, we can get its value by check the digit of corresponding position in A and B. And for…
HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第k大的 思路:高斯消元搞基,然后从低位外高位去推算 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const…
3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选,所以$2^r -1$) 然后如果$k \ge 2^r$就不存在啦 否则一定可以有$k$小,因为现在$1..r$行每行都有一位是1(左面是最高位) 从高到低枚举k的二进制,如果是1就异或上对应的行就行了,最后就是k小值啦 #include <iostream> #include <cstdi…