bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基
题目链接
题意
给定\(n\)个数,将其所有的子集(\(2^n\)个)的异或和按升序排列。给出一个询问\(q\),问\(q\)在该序列中第一次出现位置的下标(下标从\(1\)开始)。
题解
结论
记其线性基为\(\mathfrak B\),则每个异或和出现的次数为\(2^{n-|\mathfrak B|}\).
证明
从高斯消元的角度看,将\(n\)个数看作\(n\)个行向量,经行等价变换后得到一个行简化梯形矩阵,非零行的行数为\(|\mathfrak B|\),而下面的\(n-|\mathfrak B|\)行为零行。
从上面的\(|\mathfrak B|\)行中取若干行,异或起来得到一个值\(x\);而在下面的\(n-|\mathfrak B|\)行中无论取多少个与\(x\)进行异或,得到的值都仍为\(x\)(因为下面\(n-|\mathfrak B|\)行的数均为\(0\)). 因为一共有\(2^{n-|\mathfrak B|}\)种取法,所以值\(x\)出现了\(2^{n-|\mathfrak B|}\)次。
注意点
无论这\(n\)个数是否线性相关,\(0\)都始终在序列中出现,因为子集可以为空集。
进一步的,如果该\(n\)个数线性无关,则\(0\)只会出现一次,由线性无关的定义易知。
对应于上面的结论,因线性无关,所以\(|\mathfrak B|=n,2^{n-|\mathfrak B|}=1\),也是吻合的。
Code
#include <bits/stdc++.h>
#define mod 10086
#define maxl 30
using namespace std;
typedef long long LL;
LL poww(LL a, LL b) {
LL ret = 1;
while (b) {
if (b & 1) (ret *= a) %= mod;
(a *= a) %= mod;
b >>= 1;
}
return ret;
}
struct LinearBasis {
LL a[maxl+1]; int size; vector<int> v;
LinearBasis() { memset(a, 0, sizeof(a)); size = 0; v.clear(); }
void insert(LL t) {
for (int i = maxl; i >= 0; --i) {
if (!(t >> i & 1)) continue;
if (a[i]) t ^= a[i];
else {
++size;
for (int j = 0; j < i; ++j) if (t >> j & 1) t ^= a[j];
for (int j = i+1; j <= maxl; ++j) if (a[j] >> i & 1) a[j] ^= t;
a[i] = t;
return;
}
}
}
void basis() {
for (int i = 0; i <= maxl; ++i) if (a[i]) v.push_back(i);
}
LL rank(LL x) {
LL ret = 0;
for (int i = 0; i < v.size(); ++i) if (x >> v[i] & 1) ret += 1LL << i;
return ret;
}
};
int main() {
int n, x, q;
scanf("%d", &n);
LinearBasis lb;
for (int i = 0; i < n; ++i) scanf("%d", &x), lb.insert(x);
lb.basis();
scanf("%d", &q);
LL num = poww(2, n - lb.size);
printf("%lld\n", (lb.rank(q) % mod * num % mod + 1) % mod);
return 0;
}
bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基的更多相关文章
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
- BZOJ 2844: albus就是要第一个出场
2844: albus就是要第一个出场 Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 1134 Solved: 481[Submit][Status] ...
- bzoj 2844: albus就是要第一个出场 高斯消元
LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...
- bzoj 2844 albus就是要第一个出场 - 线性基
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 给定集合$S$,现在将任意$A\subseteq S$中的元素求异或和,然后存入一个数组中(下标从1开始),然后从小到大排 ...
- BZOJ 2844 albus就是要第一个出场(高斯消元)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- 2844: albus就是要第一个出场
2844: albus就是要第一个出场 链接 分析: 和HDU3949差不多互逆,这里需要加上相同的数. 结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大 ...
- CF895C: Square Subsets && 【BZOJ2844】albus就是要第一个出场
CF895C: Square Subsets && [BZOJ2844]albus就是要第一个出场 这两道题很类似,都是线性基的计数问题,解题的核心思想也一样. CF895C Squa ...
- 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...
随机推荐
- (转)规划从 OpenGL ES 2.0 到 Direct3D 的移植
如果你移植 iOS 或 Android 平台中的游戏,那么你可能需要在 OpenGL ES 2.0 方面进行大量投资.如果你准备将你的图形管道代码库移动到 Direct3D 11 和 Windows ...
- JZOJ 1267. 路障
1267. 路障(block.pas/c/cpp) (File IO): input:block.in output:block.out Time Limits: 1000 ms Memory Li ...
- 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架
在过去持续分享的几十期阿里Java面试题中,几乎每次都会问到Dubbo相关问题,比如:“如何从0到1设计一个Dubbo的RPC框架”,这个问题主要考察以下几个方面: 你对RPC框架的底层原理掌握程度. ...
- 时间转换,django的时间设置,re模块简单校验密码和手机号
时间转换和密码,手机的re模块简单校验 import re,time def check_userinfo(request): pwd = request.POST.get("pwd&quo ...
- Kubespray部署Kubernetes 1.13.0(使用本地镜像仓库)
1. 下载kubespray # git clone https://github.com/kubernetes-sigs/kubespray.git # cd kubespray # pip ins ...
- (HTML)写导航感悟
代码要规范,路径要写全 如: .div1 ul li a:link { text-decoration: none; color: white; } .div1 ul li a:visited { t ...
- 新手用WPF山寨QQ管家7.6(三)
由于一直忙工作,没有更新完博客,更可恨的是...在清理资料的时候不小心删除了之前自己做的各种效果的DEMO....好在项目中用到了大部分,也算有所保留,以后可不敢随便删东西了....太可怕了! 在 新 ...
- vijos1083:小白逛公园
小白逛公园 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的 ...
- [转]Git for windows 下vim解决中文乱码的有关问题
Git for windows 下vim解决中文乱码的问题 原文链接:Git for windows 下vim解决中文乱码的有关问题 1.右键打开Git bash: 2.cd ~ 3.vim .vim ...
- flex遭遇text-overflow:hidden,white-space:nowrap
最近在项目中遇到使用flex的时候,在flex-item元素中使用text-overflow:hidden:white-space:nowrap:进行省略文字的操作. 发现flex-item失控了,长 ...