3811: 玛里苟斯

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 500  Solved: 196
[Submit][Status][Discuss]

Description

魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题。
S 是一个可重集合,S={a1,a2,…,an}。
等概率随机取 S 的一个子集 A={ai1,…,aim}。
计算出 A 中所有元素异或 x, 求 xk 的期望。
 

Input

第一行两个正整数 n, k。
以下 n 行每行一个整数,表示 ai。
 

Output

如果结果是整数,直接输出。如果结果是小数(显然这个小数是有限的),输出精确值(末尾不加多余的 0)。
 

Sample Input

4 2

0

1

2

3

Sample Output

3.5

HINT

限制与约定
1≤n≤100000,1≤k≤5,ai≥0。最终答案小于 2^63 。k=1,2,3,4,5 各自占用 20% 的数据

Source

[Submit][Status][Discuss]

题解:
        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】玛里苟斯的更多相关文章

  1. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  2. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  3. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

  4. 清华集训2014 sum

    清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...

  5. 清华集训2014 day1 task1 玛里苟斯

    题目 这可算是描述很简单的一道题了!但是不简单. \(S\)是一个可重集合,\(S = \{a_1, a_2, \dots, a_n \}\). 等概率随机取\(S\)的一个子集\(A = \{a_{ ...

  6. [UOJ]#36. 【清华集训2014】玛里苟斯

    题目大意:给n个数字,求子集的异或和的k次方的期望(n<=10^5,k<=5,保证答案小于2^63) 做法:首先如果从集合中拿出a和b,把a和a xor b放回集合,子集的异或和与原来是一 ...

  7. UOJ#36. 【清华集训2014】玛里苟斯 线性基

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...

  8. UOJ #36「清华集训2014」玛里苟斯

    这怎么想得到啊......... UOJ #36 题意:求随机一个集合的子集的异或和的$k$次方的期望值,保证答案$ \lt 2^{63},1 \leq k \leq 5$ $ Solution:$ ...

  9. uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)

    传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...

随机推荐

  1. appium+python自动化☞appium python api大全

    整理了一些常用的appium python api,供学习使用...

  2. flask_sqlalchemy介绍

    快速入门 Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展.有关完整的指南,请参阅 SQLAlchemy 的 API 文档. 一个最小应用 常见情 ...

  3. PostgreSQL9.6主从配置

    参考文档: 备机日志传送:https://www.postgresql.org/docs/9.6/static/warm-standby.html 英文文档:https://www.postgresq ...

  4. php爬虫学习笔记1 PHP Simple HTML DOM Parser

    常用爬虫. 0. Snoopy是什么? (下载snoopy)   Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务.   Snoopy的一些特点:   * ...

  5. 冲刺ing-3

    第三次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 分配任务,燃尽图 蔺皓雯 编写博客,美化主界面 蔡晨旸 美化主界面 曾茜 主页面设计 鲁婧楠 服务器建构 杨池宇 服务器建构 成员遇到的问 ...

  6. Android数据储存之SQLiteDatabase 简单增删改查

    SQLiteDatabase 使用 SQLiteDatabase提供如下方法来打开一个文件对应的数据库: openDatabase(String path, SQLiteDatabase.Cursor ...

  7. 评价Win8自带输入法

    对于人机交互设计,有以下四个基本原则:从用户角度考虑.从头到尾记住用户选择.短期刺激和长期使用的好处坏处.不让用户犯简单错误.我用的最多的是我的系统自带的输入法,评价的也只能是它了. 1.从用户角度: ...

  8. 使用Python 、 go 语言测试rabbitmq的工作机制

    1:在haproxy 和 rabbitmq上安装Python.python2-pip,默认是Python2 yum install -y python python2-pip   2:在haproxy ...

  9. 操作系统作业一——仿CMD

    实验一.CMD实验 2014商软2  卓宇靖  4238 一.        实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3)掌握C语言编程初步. 二.        ...

  10. (五)Jmeter中的属性和变量

    一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...