题目链接

题意

给定\(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就是要第一个出场 异或和出现次数 线性基的更多相关文章

  1. BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]

    2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...

  2. BZOJ 2844: albus就是要第一个出场

    2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 1134  Solved: 481[Submit][Status] ...

  3. bzoj 2844: albus就是要第一个出场 高斯消元

    LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...

  4. bzoj 2844 albus就是要第一个出场 - 线性基

    题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 给定集合$S$,现在将任意$A\subseteq S$中的元素求异或和,然后存入一个数组中(下标从1开始),然后从小到大排 ...

  5. BZOJ 2844 albus就是要第一个出场(高斯消元)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...

  6. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  7. 2844: albus就是要第一个出场

    2844: albus就是要第一个出场 链接 分析: 和HDU3949差不多互逆,这里需要加上相同的数. 结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大 ...

  8. CF895C: Square Subsets && 【BZOJ2844】albus就是要第一个出场

    CF895C: Square Subsets && [BZOJ2844]albus就是要第一个出场 这两道题很类似,都是线性基的计数问题,解题的核心思想也一样. CF895C Squa ...

  9. 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基

    [BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...

随机推荐

  1. go包的理解

    结论: import时指定的字符串,是相对于$GOPATH的目录路径,告诉了go,要去加载这个目录下所有的包文件(不包括子目录中的文件) 一个目录中所有的源文件(不包括子目录)代表了单独的一个包,这些 ...

  2. 动态规划:HDU1789-Doing Homework again

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. SHIWEITI

    //Wannafly挑战赛19(牛客网) //A 队列Q #include <iostream> #include <cstdio> #include <cstring& ...

  4. Diycode开源项目 磁盘图片缓存+自定义webViewClient+图片点击js方法

    1.磁盘图片缓存器DiskImageCache 1.1.这个类很多情况都可能用的到,耦合性很低,所以分开讲. 源代码: /* * Copyright 2017 GcsSloop * * License ...

  5. 1250 Fibonacci数列(矩阵乘法快速幂)

    1250 Fibonacci数列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 定义:f0=f1=1, f ...

  6. “帮你APP”团队冲刺8

    1.整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’) : 所有工作的预期时间:88h 目前已经 ...

  7. daily algorithm 判断链表是否有环

    public static boolean isLoopLink(ListNode head) { if (head == null) { return false; } ListNode fast ...

  8. vue-router2.0组件复用

    在使用vue-router1.x时我们知道对于路由 a/b/c  和  a/b/d ,  组件a和组件b将会复用 .具体可以参考:https://github.com/vuejs/vue-router ...

  9. SXCPC2018 nucoj2007 和Mengjiji一起攻克难关

    problem #include <algorithm> #include <iostream> #include <cstdio> using namespace ...

  10. 赢友网络通用框架V10.0.0(WinuAppSoft) 基础框架设计表

    /* * 版权所有:赢友网络(http://www.winu.net/) * 开发人员:新生帝(JsonLei) * 设计名称:赢友网络通用框架V10.0.0(WinuAppSoft) * 设计时间: ...