【bzoj3811】【清华集训2014】玛里苟斯
3811: 玛里苟斯
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 500 Solved: 196
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0
1
2
3
Sample Output
HINT
Source
题解:
wwwwodddd ORZ
求子集异或和k次方的期望;
首先这和期望的k次方不一样,所以还是老老实实按k分类讨论,按位算贡献吧:
k=1 , 考虑第i位是否有1,有会贡献的$2^{i-1} $, 全部或起来除二;
k=2,如果某个异或和的第i位和第j为都有值,会贡献$2^{i+j}$的答案 , 首先这两位都必须要有至少一个1;
紧接着如果对于每一个数来说,这两位的值都相同 ,说明两位不相互独立,所以概率是1/2,期望是$2^{i+j-1}$;
否则说明两位独立,在异或运算下(0,0)(0,1)(1,0)(1,1)的概率相同为1/4,期望是$2^{i+j-2}$;
k>=3 , 由于答案在2^63次方以内,所以线性基的大小不会超过22,直接暴力枚举计算期望;
这题有一个结论是答案*2一定是整数;
也就是答案的小数最多有一位;
这里有个评论证明了,但是我没太看懂: https://blog.sengxian.com/solutions/bzoj-3811 自己给出一个可能不太严谨的证明吧(没学过数学。。。): 可以仔细分析一下k==2时的算法;
再扩展到k次方,发现在异或运算下:
二进制位之间贡献不相互独立是具有传递性的;
假设一次计算答案时选定的k个二进制位(可能相同分)集合为:
B = {b1,b2,...bk}
我们可以把他们进一步分成m个集合:
S1...Sm
相同集合元素贡献不互相独立,不同集合贡献互相独立;
这时对答案期望的贡献应该是2^{b1+b2+...+bk - m} ;
而k >= m , 且B里面至少有m个不同的二进制位(即bi!=bj这种);
所以考虑b1+b2+...+bk - m最小的情况:
分析可以发现最小为-;
所以答案小数点后只有一位; 。。。。。。
如果你感兴趣的话
这样就可以用一个数存下对2^|B|的除数和余数,分类讨论小数位的情况(建议看下代码);
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<set>
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define ll unsigned long long
#define ld long double
#define inf 0x3f3f3f3f
using namespace std;
const int N=;
int n,m,cnt;
ll a[N],d[],res,ans;
char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
ll rd(){
ll x=; char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
void solve1(){
Run(i,,n){
ll x=rd();
ans|=x;
}
printf("%llu",ans>>);
if(ans&)printf(".5\n");
else puts("");
}
void solve2(){
Run(i,,n)a[i]=rd();
for(int i=;i<=;i++)
for(int j=;j<=;j++){
int fg1=,fg2=,fg3=;
for(int k=;k<=n;k++){
if(a[k]>>i&)fg1=;
if(a[k]>>j&)fg2=;
if((a[k]>>i&)!=(a[k]>>j&))fg3=;
if(fg1&&fg2&&fg3)break;
}
if(!fg1||!fg2)continue;
if(i+j-fg3-<)res++;
else ans+=1ull<<(i+j-fg3-);
}
ans+=res>>; res&=;
printf("%llu",ans);
if(res)printf(".5\n");
else puts("");
}
void solve3(){
for(int i=;i<=n;i++){
ll x=rd();
for(int j=;~j;j--)if(x>>j&){
if(!d[j]){d[j]=x;break;}
else x^=d[j];
}
}
for(int i=;i<=;i++)if(d[i])a[cnt++]=d[i];
for(int i=;i<<<cnt;i++){
ll x=;
for(int j=;j<cnt;j++)if(i>>j&)x^=a[j];
ll t1=,t2=;
for(int j=;j<=m;j++){
t1*=x , t2*=x;
t1 += t2 >> cnt , t2 &= (<<cnt) - ;
}
ans += t1 , res += t2;
ans += res >> cnt , res &= (<<cnt) - ;
}
printf("%llu",ans);
if(res)printf(".5\n");
else printf("\n");
}
int main(){
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
n=rd(); m=rd();
if(m==)solve1();
else if(m==)solve2();
else solve3();
return ;
}//by tkys_Austin;
【bzoj3811】【清华集训2014】玛里苟斯的更多相关文章
- uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题
[清华集训2014]矩阵变换 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...
- AC日记——【清华集训2014】奇数国 uoj 38
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...
- UOJ#46. 【清华集训2014】玄学
传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...
- 清华集训2014 sum
清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...
- 清华集训2014 day1 task1 玛里苟斯
题目 这可算是描述很简单的一道题了!但是不简单. \(S\)是一个可重集合,\(S = \{a_1, a_2, \dots, a_n \}\). 等概率随机取\(S\)的一个子集\(A = \{a_{ ...
- [UOJ]#36. 【清华集训2014】玛里苟斯
题目大意:给n个数字,求子集的异或和的k次方的期望(n<=10^5,k<=5,保证答案小于2^63) 做法:首先如果从集合中拿出a和b,把a和a xor b放回集合,子集的异或和与原来是一 ...
- UOJ#36. 【清华集训2014】玛里苟斯 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...
- UOJ #36「清华集训2014」玛里苟斯
这怎么想得到啊......... UOJ #36 题意:求随机一个集合的子集的异或和的$k$次方的期望值,保证答案$ \lt 2^{63},1 \leq k \leq 5$ $ Solution:$ ...
- uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)
传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...
随机推荐
- 袋鼠云研发手记 | 袋鼠云EasyManager的TypeScript重构纪要
作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...
- jupyter通过notedown使用markdown
0 Problem 最近看了下李沐老师的mxnet教程,在使用jupyter的时候打开教程发现全是markdown源文,没有展示markdown格式的文字. 1 Reason 源代码是用markdow ...
- Python mutilprocessing Processing 父子进程共享文件对象?
multiprocessing python多进程模块, 于是, Processing也是多进程的宠儿. 但今天讨论的问题, 似乎也能引起我们一番重视 直接上代码: 1 2 3 4 5 6 7 ...
- xpath获取同级元素
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集: 1.child 选取当前节点的所有子元素 2.parent 选取当前节点的父节点 3.descendant 选取当前节点的所有后 ...
- php新手需要注意的高效率编程
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静 ...
- 02慕课网《vue.js2.5入门》——Vue中的组件,实现todolist
TodoList功能开发 例子:输入字符,在列表中显示: 由于有v-for属性,<li>不会被渲染,它已经和数据绑定在一起,有数据来决定 input和button上都有事件监听器,inpu ...
- ubuntu16.04卸载火狐,Amazon
一.卸载火狐: . dpkg --get-selections |grep firefox .sudo apt-get purge firefox unity-scope-firefoxbookmar ...
- 团队作业4——第一次项目冲刺(Alpha版本)第三次
一.会议内容 制定任务内容 制作leangoo表格 初步工作 二.各人工作 成员 计划任务 遇见难题 贡献比 塗家瑜(组长) api搭建 无 1 张新磊 数据库搭建完成 无 1 姚燕彬 功能测试 无 ...
- eclipse取消validation验证
点击按钮如下:window-Preferences-Validation.如图. 然后把build里面的都取消.即可.
- docker-py execute echo无效
错误写法: cli.execute('9b2606a50304','echo "bibo">/tmp/1.txt') 争取写法: cli.execute('9b2606a ...