UOJ #36「清华集训2014」玛里苟斯
这怎么想得到啊.........
题意:求随机一个集合的子集的异或和的$k$次方的期望值,保证答案$ \lt 2^{63},1 \leq k \leq 5$
$ Solution:$
首先考虑$ k=1$的时候怎么做:如果某位上有$ 1$则有$ \frac{1}{2}$的概率可以取到这一位
$ k=1$时每一位都是独立的,可以直接做
然后考虑$ k=2$时怎么做
如果一个集合中有元素$ a,b$,则产生的贡献为$ a^2+2ab+b^2$
我们把$ a^2$和$2ab$分开讨论
如果某位有$ 1$,则有$ \frac{1}{4}$的概率取到$ a^2$
如果某两个不同的位均有$ 1$,则有$ \frac{1}{4}$的概率取到$ 2ab$
注意如果这两个不同的位只能一起被取,这个概率将被改成$ \frac{1}{2}$
然后考虑$ 3 \leq k \leq 5$时怎么做
发现产生任何一个能够被原集合的若干个数异或和表示的数都是等概率的
因此我们只需要保留原集合的线性基即可
由于答案$ \lt 2^{63}$,能产生的最大的数并不大,大约为$ \sqrt[k]{2^{63}}$级别
因此能表示出的数的数量大致也是这个级别的
建出线性基之后爆搜每个数并统计答案
注意中间计算过程中可能会爆$ long \ long$可能需要手写压位或$int128$
$ my \ code(int128)$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z;unsigned ll cnt,c[],a[];
namespace subtask1{
bool b[];
void main(){
ll ans=;
for(rt i=;i<=n;i++)for(rt j=;j<=;j++)if(a[i]>>j&)b[j]=;
for(rt j=;j<=;j++)if(b[j])cnt+=(unsigned ll)<<j;
cout<<(cnt/);if(cnt%)cout<<".5";
}
}
namespace subtask2{
bool b1[][],b2[][],b[];
void main(){
__int128 ans=;
for(rt i=;i<=n;i++)
for(rt j=;j<=;j++)
for(rt k=;k<=;k++)if(j!=k){
if(a[i]>>j&){
if(a[i]>>k&)b1[j][k]=;else b2[j][k]=;
b[j]=;
}
}
for(rt i=;i<=;i++)
for(rt j=i+;j<=;j++){
__int128 all=;
if(b1[i][j])all=;
if(b1[i][j]&&(b2[i][j]||b2[j][i]))all=;
if(b2[i][j]&&b2[j][i])all=;
if(all)
ans+=all**(1ll<<i)*(1ll<<j);
}
for(rt i=;i<=;i++)if(b[i])ans+=(unsigned ll)*(1ll<<i)*(1ll<<i);
ans/=;write(ans/);
if(ans&)cout<<".5";
}
}
namespace subtask3{
__int128 ans;
__int128 mi(__int128 x,int y){
__int128 ans=;
for(rt i=;i<=y;i++)ans*=x;
return ans;
}
void dfs(int x,__int128 y){
if(x>n){
ans+=mi(y,m);
return;
}
dfs(x+,y);dfs(x+,y^a[x]);
}
void main(){
ans=;dfs(,);
for(rt i=;i<n;i++)ans/=;
write(ans/);if(ans&)cout<<".5";
}
}
int main(){
n=read();m=read();
for(rt i=;i<=n;i++){
ll x=read();
for(rt j=;j>=;j--)if(x>>j&){
if(c[j])x^=c[j];
else {
c[j]=x;
break;
}
}
}
n=;
for(rt i=;i<=;i++)if(c[i])a[++n]=c[i];
if(m==)subtask1::main();
if(m==)subtask2::main();
if(m>=)subtask3::main();
return ;
}
UOJ #36「清华集训2014」玛里苟斯的更多相关文章
- UOJ #36 -【清华集训2014】玛里苟斯(线性基+暴搜)
UOJ 题面传送门 看到 \(k\) 次方的期望可以很自然地想到利用低次方和维护高次方和的套路进行处理,不过.由于这里的 \(k\) 达到 \(5\),直接这么处理一来繁琐,二来会爆 long lon ...
- [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】玛里苟斯(线性基+概率期望)
传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...
- UOJ #276「清华集训2016」汽水
为什么你们常数都这么小啊 UOJ #276 题意:在树上找一条链使得|边权平均值$ -k$|尽量小,$ n<=5e4$ $ Solution:$ 首先二分答案$ ans$,即我们需要找一条链使得 ...
- UOJ #2321. 「清华集训 2017」无限之环
首先裂点表示四个方向 一条边上都有插头或者都不有插头,相当于满足流量平衡 最大流 = 插头个数*2时有解 然后求最小费用最大流 黑白染色分别连原点汇点
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
随机推荐
- /etc/profile
PS1:就是用户平时的提示符. PS2:第一行没输完,等待第二行输入的提示符. Linux系统提示符是用系统变量PS1来定义的.一般系统默认的形式是:[username@host 工作目录]$. 用e ...
- '新', '泽' - ImageMagick - UTF-8非最短形式及编码安全问题
最近偶然发现,把软件放到 [新建文件夹] 中,ImageMagick 竟无法正常的加载图片了. 我去!什么情况? 抛出的错误是找不到相关的dll,软件中已对中文进行了utf-8编码,这几年来一直没发 ...
- RAP Mock.js语法规范
Mock.js 的语法规范包括两部分: 数据模板定义规范(Data Template Definition,DTD) 数据占位符定义规范(Data Placeholder Definition,DPD ...
- 第二十二节,TensorFlow中RNN实现一些其它知识补充
一 初始化RNN 上一节中介绍了 通过cell类构建RNN的函数,其中有一个参数initial_state,即cell初始状态参数,TensorFlow中封装了对其初始化的方法. 1.初始化为0 对于 ...
- Day16--Python--初识面向对象
今日主要内容一. 面向对象思想 1. 面向过程. 重点在'过程'. 按照事物迭代发展流程. 优点: 简单,流水线式的操作 缺点: 可扩展性差.可维护性差. 2. 面向对象. 对象是属性和动作的集合体. ...
- (贪心 模拟?) codeVs1098 均分纸牌
题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...
- nginx+keepalived高可用web负载均衡
一:安装环境 准备2台虚拟机,都安装好环境 centos 7keepalived:vip: 192.168.1.112192.168.1.110 nginxip 192.168.1.109 maste ...
- 2017-12-15python全栈9期第二天第七节之布尔值转数字
#!/user/bin/python# -*- coding:utf-8 -*-print(int(True))print(int(False))
- 01--STL算法(算法基础)
一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中 ...
- tomcat如何访问非webapp下的资源文件
只要在%tomcathome%\conf\server.xml文件,在标签中加入文件中加入如下代码即可: <Host name="localhost" appBase=&qu ...