【线性基】bzoj2844: albus就是要第一个出场
线性基求可重rank
题目描述
给定 n 个数 $\{ a_i \}$ ,以及数 $x$。
将 $\{ a_i \}$ 的所有子集(包括空集)的异或值从小到大排序,得到 $\{ b_i \} $。
求 $x$ 在 $\{ b_i \}$ 中第一次出现的下标。保证 $x$ 在 $\{ b_i \}$ 中出现。
HINT
数据范围:
1 <= N <= 10,0000
其他所有输入均不超过10^9
题目分析
考虑线性基求rank的过程,是一个求第k大的逆过程。也就是首先对线性基消元,再把线性基的元素给排出来,继而考虑每一位被线性基内第几个元素控制。
而现在是一个可重集,于是{1,1}和{1,1,1,1,1}就成了截然不同的两种情况。记线性基内有$legal$个元素,那么剩下就是$n-legal$个可被线性基表示的数字(下面简称无关数字)。沿用线性基题的一类思维方式,考虑这类无关数字对于线性基的影响。我们会发现,不论选出哪一部分无关数字(共$2^{n-legal}$种情况),都有且仅有一种“在线性基内选数”的方式使得选出的无关数字被重新异或为0.也就是说,记原rank为$preRank$,可重集rank就是$preRank*2^{n-legal}+1$。
对了,求原rank时候记得要和第k大操作一样把线性基元素重新拎出来。
#include<bits/stdc++.h>
const int maxn = ;
const int MO = ; int n,p[],ans,legal; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void insert(int x)
{
for (int i=, chk=; i>=&&!chk; i--)
if (x>>i){
if (p[i]) x ^= p[i];
else{
p[i] = x, chk = , ++legal;
for (int j=; j>i; j--)
if (p[j]>>i) p[j] ^= p[i];
}
}
}
void query(int x)
{
int i,j;
for (i=, j=; i<=; i++)
if (p[i]) p[j] = i, ++j;
for (i=j-; i>=; i--)
if ((<<p[i])&x) ans += (<<i);
}
int qmi(int a, int b)
{
int ret = ;
for (a%=MO; b; b>>=, a=a*a%MO)
if (b&) ret = ret*a%MO;
return ret;
}
int main()
{
n = read();
for (int i=; i<=n; i++) insert(read());
query(read());
ans = (1ll*ans*qmi(, n-legal)%MO+)%MO;
printf("%d\n",ans);
return ;
}
END
【线性基】bzoj2844: albus就是要第一个出场的更多相关文章
- 【贪心】【线性基】bzoj2844 albus就是要第一个出场
引用题解:http://blog.csdn.net/PoPoQQQ/article/details/39829237 注意评论区. #include<cstdio> using names ...
- 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: 2054 Solved: 850[Submit][Status][Discuss] Descriptio ...
- bzoj千题计划195:bzoj2844: albus就是要第一个出场
http://www.lydsy.com/JudgeOnline/problem.php?id=2844 题意:给定 n个数,把它的所有子集(可以为空)的异或值从小到大排序得到序列 B,请问 Q 在 ...
- 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
- BZOJ_2844 albus就是要第一个出场 【线性基】
一.题目 albus就是要第一个出场 二.分析 非常有助于理解线性基的一题. 构造线性基$B$后,如果$|A| > |B|$,那么就意味着有些数可以由$B$中的数异或出来,而多的数可以取或者不取 ...
- 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] ...
随机推荐
- 1366 - Incorrect string value:'\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' a 错误修改
把name的字符集修改成 utf8 ,然后把表关了从新打开,就可以了 如果还不行,就从新创表,在创表的时候修改name的字符集 如果还不行,就修改my.ini 它在你的mysql安装路径里 [mysq ...
- 密码暴力破解工具acccheck使用
title: acccheck categories: Password Attacks tags: [passwords,kali linux,acccheck,infogathering,pass ...
- 转 MySQL权限管理
###sample: #####view all userSELECT user, host from mysql.user;mysql> SELECT user, host from mysq ...
- csu 1554: SG Value 思维题
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1554 这题在比赛的时候居然没想出来,然后发现居然是做过的题目的变种!!!! 先不考虑插入操作, ...
- ms sqlserver 清除数据库日志脚本
USE [master] GO ALTER DATABASE F360DW SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE F360DW SET ...
- App配置页面头部
记录一下 App配置页面头部 例 上图红色框部分就是自己配置的头部 //我的客户 "/OACustomer/Index": { title: "我的客户", h ...
- 基于名称的虚拟主机-Apache
基于名称的虚拟主机和基于IP的虚拟主机的对比 基于IP的虚拟主机使用连接的IP地址来识别(区分)正确的虚拟主机,所以对于每一个虚拟主机,你都需要有独立的IP地址. 基于名称的虚拟主机,服务器依赖于客户 ...
- css3的过渡、动画、2D、3D效果
浏览器的内核: 谷歌的内核是:webkit 火狐的内核是:gecko Ie的内核是:trident 欧鹏的内核是:presto 国内浏览器的内核:webkit css3针对同一样式在不同的浏览器的兼容 ...
- 行框基线位置确定(line box 基线)
在设置vertical-align属性(只有inline元素有效,对inline-block和block元素无效)时有一个属性值:baseline,那么这个基线是什么,怎么确定. 这个基线就是其所在行 ...
- <Android 应用 之路> 天气预报(三)
昨天介绍了基本的载入界面,今天介绍下天气信息显示界面的代码 基本ListView显示 搜索框,查询城市 上一篇文章中,载入界面通过showWeatherInfo()方法跳转到天气信息显示界面 priv ...