Luogu 4869 albus就是要第一个出场
BZOJ 2844
被NOIP模拟赛题弄自闭了QuQ。
因为本题要求异或,所以自然地构造出线性基,假设本题中给出的数有$n$个,而我们构造出的线性基大小为$m$,那么每一个可以异或出来的数相当于出现了$2^{n - m}$次。
可以把那些已经存在于异或空间中的数看成$0$,因为我们一共能凭凑出$2^m$个不同的异或值,剩下的$n - m$个数相当于可选可不选,所以每一个值有$2^{n - m}$种方案异或上一个$0$。
然后算一算$q$在不重复的异或空间中排第几就可以了,具体做法就是把$q$用二进制表示,如果有一位$1$在线性基中存在,那么就说明剩下的数可选可不选,一共有$2^($线性基中的排名$)$个数比它小,最后还要计算$0$,需要$+1$。
假设排名为$k$,答案就是$k*2^{n - m}$。
时间复杂度$O(nlogn)$。
Code:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 1e5 + ;
const int M = ;
const ll P = 10086LL; int n, q, a[N]; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} namespace Lb {
int m = , p[M]; inline void ins(int v) {
for(int i = ; i >= ; i--)
if((v >> i) & ) {
if(!p[i]) {
++m;
p[i] = v;
break;
}
v ^= p[i];
}
} } using namespace Lb; inline ll fpow(ll x, ll y) {
ll res = 1LL;
for(; y > ; y >>= ) {
if(y & ) res = res * x % P;
x = x * x % P;
}
return res;
} int main() {
// freopen("4.in", "r", stdin); read(n);
for(int i = ; i <= n; i++) {
read(a[i]);
ins(a[i]);
}
read(q); int stk[M], top = ;
for(int i = ; i <= ; i++)
if(p[i]) stk[top++] = i;
ll ans = 0LL;
for(int i = ; i < top; i++)
if((q >> stk[i]) & )
ans += 1LL << i; ans %= P;
printf("%lld\n", (ans * fpow(, n - top) % P + ) % P);
return ;
}
Luogu 4869 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 ...
- bzoj2884 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 ...
随机推荐
- [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)
本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...
- WPF设置全局快捷键
转自:http://www.cnblogs.com/atskyline/archive/2012/09/20/2694878.html 第一步 引入到Winows API 偷懒直接写在类里 1: [D ...
- LG3380 3380 【模板】二逼平衡树(树套树)
题意 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在区间内的前驱(前驱定义为严格小于x ...
- 第15篇 PSR-04 规范
1. Overview This PSR describes a specification for autoloading classes from file paths. It is fully ...
- CentOS 7 Update GCC G++
curl https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2 -O echo "extracting files..." ...
- centos7 & ubuntu14.02安装sublime 3
Centos7安装Sublime Text 3.0正式版 1.安装 GPG 公钥rpm -v --import https://download.sublimetext.com/sublimehq-r ...
- TableView刷新 局部刷新等
1.对整个页面刷新 [ tableView reloadData]; 2.对某一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithI ...
- php 权限 管理
权限的思考: https://www.jianshu.com/p/cf9077a7d38a 权限例子,用户 角色 功能 用户角色关联表 角色功能关联表 http://www.cnblogs.com/n ...
- 分布式缓存系统 Memcached 状态机之SET、GET命令
首先对状态机中的各种状态做个简单总结,具体可见状态转换示意图: 1.listening:这个状态是主线程的默认状态,它只有这一个状态:负责监听socket,接收客户连接,将连接socket派发给工作线 ...
- 1131 Subway Map
题意:给出起点和终点,计算求出最短路径(最短路径即所经过的站点最少的),若最短路径不唯一,则选择其中换乘次数最少的一条线路. 思路:本题虽然也是求最短路径,但是此路径是不带权值的,路径长度即所经过的边 ...