bzoj2884 albus就是要第一个出场
Description
Input
第一行一个数n, 为序列A的长度。接下来一行n个数, 为序列A, 用空格隔开。最后一个数Q, 为给定的数.
Output
Sample Input
1 2 3
1
Sample Output
样例解释:
N = 3, A = [1 2 3]
S = {1, 2, 3}
2^S = {空, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
f(空) = 0
f({1}) = 1
f({2}) = 2
f({3}) = 3
f({1, 2}) = 1 xor 2 = 3
f({1, 3}) = 1 xor 3 = 2
f({2, 3}) = 2 xor 3 = 1
f({1, 2, 3}) = 0
所以
B = [0, 0, 1, 1, 2, 2, 3, 3]
HINT
数据范围:
1 <= N <= 10,0000
其他所有输入均不超过10^9
正解:线性基。
题意就很绕。。给定一个序列,任意异或得到一个新的序列,并把序列排序。再给定一个Q,求Q在新序列中的排名。
然后我就不会做了。看了题解才知道线性基原来还有一个神奇的性质。
n个数的序列共有$2^{n}$种异或和,n个数的线性基共有k个数,所以n个数的线性基共有$2^{k}$种不同的异或和。神奇的是,$2^{k}$不同的异或和在$2^{n}$种异或和中出现的次数竟然相同,都是$2^{n-k}$次!
所以,我们只要算出线性基中异或和小于Q的数的个数,然后乘上$2^{n-k}$,再加上1,这个就是答案了。
- //It is made by wfj_2048~
- #include <algorithm>
- #include <iostream>
- #include <complex>
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <map>
- #include <set>
- #define inf (1<<30)
- #define rhl (10086)
- #define N (100010)
- #define il inline
- #define RG register
- #define ll long long
- #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
- using namespace std;
- vector <int> Q;
- int a[N],p[],n,q,rk,cnt;
- il int gi(){
- RG int x=,q=; RG char ch=getchar(); while ((ch<'' || ch>'') && ch!='-') ch=getchar();
- if (ch=='-') q=-,ch=getchar(); while (ch>='' && ch<='') x=x*+ch-,ch=getchar(); return q*x;
- }
- il void insert(RG int x){
- for (RG int i=;i>=;--i)
- if (x&(<<i)){
- if (!p[i]){ p[i]=x; break; }
- x^=p[i];
- }
- return;
- }
- il int qpow(RG int a,RG int b){
- RG int ans=;
- while (b){
- if (b&) ans=ans*a%rhl;
- a=a*a%rhl,b>>=;
- }
- return ans;
- }
- il void work(){
- n=gi(); for (RG int i=;i<=n;++i) a[i]=gi(),insert(a[i]); q=gi();
- for (RG int i=;i<=;++i) if (p[i]) Q.push_back(i),cnt++;
- for (RG int i=;i<Q.size();++i) if (q&(<<Q[i])) rk+=<<i;
- printf("%d\n",(rk%rhl*qpow(,n-cnt)%rhl+)%rhl);
- return;
- }
- int main(){
- File("albus");
- work();
- return ;
- }
bzoj2884 albus就是要第一个出场的更多相关文章
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
- CF895C: Square Subsets && 【BZOJ2844】albus就是要第一个出场
CF895C: Square Subsets && [BZOJ2844]albus就是要第一个出场 这两道题很类似,都是线性基的计数问题,解题的核心思想也一样. CF895C Squa ...
- BZOJ 2844: albus就是要第一个出场
2844: albus就是要第一个出场 Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 1134 Solved: 481[Submit][Status] ...
- 2844: albus就是要第一个出场
2844: albus就是要第一个出场 链接 分析: 和HDU3949差不多互逆,这里需要加上相同的数. 结论:所有数任意异或,构成的数出现一样的次数,次数为$2^{n-cnt}$,cnt为线性基的大 ...
- 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...
- BZOJ_2844 albus就是要第一个出场 【线性基】
一.题目 albus就是要第一个出场 二.分析 非常有助于理解线性基的一题. 构造线性基$B$后,如果$|A| > |B|$,那么就意味着有些数可以由$B$中的数异或出来,而多的数可以取或者不取 ...
- BZOJ2844: albus就是要第一个出场
Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2^S定义为S 所有子集构成的集合. 定义映射 f ...
- 【bzoj2844】albus就是要第一个出场
Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 2254 Solved: 934[Submit][Status][Discuss] Descriptio ...
- BZOJ2844: albus就是要第一个出场(线性基)
Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 2054 Solved: 850[Submit][Status][Discuss] Descriptio ...
随机推荐
- MySQL相关信息(二)
1.修改MySQL提示符 (1)连接客户端时通过参数指定 shell>mysql -u root -p --prompt 提示符 C:\Users\Administrator>mysql ...
- iOS项目之同时点击多个按钮解决方案
自己的项目完成后,在测试中出现了一个情况,同时点击界面中的多个按钮,会跳转多个界面.然后又看了看别的app,发现也有这样的情况, 如图 上面是我手机上美团app的截图,上面的分类同时选择多个时,只能跳 ...
- kali linux 忘记root密码重置办法
有段时间没用kali linux 的,加上最近装的系统有比较多,系统root的密码忘掉了,真是麻烦啊.之前在网上看到的一些方法尝试后没进的去,可能是因为不同的linux 不一样吧. 如果因为忘记密码而 ...
- PHP语言开发微信公众平台(订阅号)之注册
1.百度搜索"微信公众平台" 2.选择微信公众平台官网并单击打开 3.进入官网页面,单击 "立即注册" 进入注册页面 4.进入注册页面,单击订阅号 5.进入订阅 ...
- 图解Javascript——变量对象和活动对象
span { line-height: 1.5 } 这是由一段代码引发的思考: var laterDeclaredVar = 'I am a global variable ...'; (functi ...
- 微信JS图片上传与下载功能--微信JS系列文章(三)
概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...
- 兼容主流浏览器的js原生函数封装
1.获取和修改垂直滚动条的滚动距离 //获取滚动条滚动距离function getScrollTop(){ var fromTop=document.documentElement.scrollTop ...
- 初识Javascript.03 -- switch、自增、while循环、for、break、continue、数组、遍历数组、合并数组concat
除了注意大小写,别的木啥了 Switch语句 Switch(变量){ case 1: 如果变量和1的值相同,执行该处代码 break; case 2: 如果变量和2的值相同,执行该处代码 break; ...
- ruby安装sass报错解决办法
ERROR: Could not find a valid gem 'sass' (>= 0), here is why: Unable to download data from http:/ ...
- Java 枚举详解
为什么要用枚举 在博客系统中,一篇文章有且可能有这几种状态, 数据库中article文章表中state字段存储数值,表示其状态: 0(已发表Published) 1(草稿Draft) 2(撤回撤回(D ...