https://www.lydsy.com/JudgeOnline/problem.php?id=2844

已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2^S定义为S 所有子集构成的集合。
定义映射 f : 2^S -> Z
f(空集) = 0
f(T) = XOR A[t] (对于一切t属于T)
现在albus把2^S中每个集合的f值计算出来, 从小到大排成一行, 记为序列B(下标从1开始)。
给定一个数, 那么这个数在序列B中第1次出现时的下标是多少呢?

这话真的不是人说出来的。

简单翻译一下题就是序列所有的子集(可为空)的异或和经过排序,给一个q,求q在排序后序列中的位置下标。

参考:https://blog.sengxian.com/algorithms/linear-basis

如果是无重的,我们按照类似HDU3949:XOR的做法二进制分解q即可做(看代码应该更好理解吧)。

但是有重集合就很尴尬。

不过我们有对于一个数x,它出现次数一定是2^(n-size)(size为线性基大小)。

详细证明可以看参考,这里给出我的想法。

显然对于原线性基有且仅有一种方法构造出来x,且有且仅有一种方法构造出来非线性基内但却在a序列中的数。

那么对于非线性基内但却在a序列中的数有(n-size)个,它们和线性基内的数异或为0的方法有(n-size),排列组合就有2^(n-size)个,再与仅有一种方法构造出来x,就有2^(n-size)个了。

于是我知道了它去重前的排名,它排名前面的数都乘上2^(n-size)后+1即为答案。

PS:自己曾经也纠结过第一次算ans是否需要减一,但后来发现集合可为空……emmm这不值就有0了吗,对于0也满足这个性质啊,但是ans算排名的时候忽略了0啊。所以相当于ans-1+1=ans了啊。

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=100010;
const int p=10086;
const int BASE=30;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
int qpow(int k,int n){int res=1;while(n){if(n&1)res=res*k%p;k=k*k%p;n>>=1;}return res;
}
int a[N],b[BASE+4],cnt;
vector<int>mp;
int main(){int n=read();for(int i=1;i<=n;i++){a[i]=read();for(int j=BASE;j>=0;j--){if(a[i]>>j&1){if(b[j])a[i]^=b[j];else{b[j]=a[i];cnt++;break;}}}}int q=read(),ans=0;for(int i=0;i<=BASE;i++)if(b[i])mp.push_back(i);for(int i=0;i<mp.size();i++){if(q>>mp[i]&1)ans+=1<<i;ans%=p;}ans=ans*qpow(2,n-cnt)%p+1;printf("%d\n",ans%p);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8819185.html

BZOJ2844:albus就是要第一个出场——题解相关推荐

  1. BZOJ2844: albus就是要第一个出场(线性基)

    Time Limit: 6 Sec  Memory Limit: 128 MB Submit: 2054  Solved: 850 [Submit][Status][Discuss] Descript ...

  2. [BZOJ2844]albus就是要第一个出场(线性基)

    题目: 我是超链接 题解: 先不考虑重复数字的问题,如果要求数字Q的出现位置的话,首先一个比较直观的想法是,如果能求出这样一组基底,它从小到大排序以后可以满足:设只选i向量构造出来的数字为R,那么1. ...

  3. bzoj2844 albus就是要第一个出场(线性基【询问排名)

    题目链接 分析: 这道题是hdu3949的逆运算(可能题面有点难懂) 既然我们能够知道排名是第k的数是多少 就可以直接二分,变成判定性问题 当然,这道题还有其他解法: 因为是子集异或和,可以考虑用线性 ...

  4. 【bzoj2844 albus就是要第一个出场】

    题意:给定一个n个数的集合S和一个数x,求x在S的2n2n个子集从小到大的异或和序列中最早出现的位置 根据性质每一个数字出现的次数是相同的都是2^(n-cnt)个,cnt是线性基中元素得个数 #inc ...

  5. BZOJ2844 albus就是要第一个出场

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2844 这题貌似HDU上有一道差不多的题,不过我没做过,也就没管了. 首先讲一个线性基的东西 ...

  6. [BZOJ2844]albus就是要第一个出场

    题目 传送门 to BZOJ 传送门 to VJ 思路 看到异或,想到线性基.再仔细观察一下,好像每个元素出现的次数都是一样的耶! 我们有两种证明方法.其一是,考虑某个异或和出现次数超过一的原因:⨁c ...

  7. [BZOJ 2844] albus就是要第一个出场

    2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MB Submit: 2316  Solved: 964 [Submit][Statu ...

  8. bzoj 2844: albus就是要第一个出场(线性基)

    2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MB Submit: 1635  Solved: 680 [Submit][Statu ...

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

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

最新文章

  1. Linux基础命令---znew
  2. python编程 语言-python程序设计语言
  3. python学了有什么用处-Python主要用途是哪些,跟机器学习等有啥关系呢?
  4. 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )
  5. 【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
  6. SAP调用外部web service
  7. python pymysql实例_python-Mysql的操作(pyMysql的介绍)
  8. 小个子怎么能穿得优雅大方呢?
  9. 讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog
  10. SVN更新有问题 svn The working copy at‘ ‘ is too old
  11. JSP文件的中文在浏览器上显示乱码解决方法
  12. js实现农历时间代码
  13. 利用Git命令进行版本控制之常见命令汇总
  14. 干货:如何打造一个直播平台
  15. EXCEL 快速统计一列中相同数值出现的个数
  16. 超级计算机在日常生活中有哪些有趣的应用
  17. 1.10 企业首席信息官CIO及其职责
  18. 敏捷神话1:“敏捷是一种方法论”
  19. 基于遗传算法的BP神经网络优化
  20. ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测

热门文章

  1. 如何解决Could not load file or assembly ‘xxx.yyy, version=1.0.0.0, culture=neutral, public
  2. 小小爬虫很狂暴-----day01
  3. 探访安徽休宁的传统小吃:古法舂碓麻糕迎新年
  4. OpenCV基础入门系列基本操作——贰
  5. Citrix 服务器虚拟化之二十五 桌面虚拟化之XenDesktop高可用性
  6. 【AI TOP 10】扎克伯格要整顿Facebook;LeCun飙脏话批机器人Sophia;北京站加装人脸识别检票机
  7. Objective-C Blocks Caveat
  8. 详解上海交大819考研
  9. repeater控件 php,JavaScript Repeater模板控件
  10. 计算机如何共享电视,怎么让电脑和电视共用一个显示器?