这怎么想得到啊.........

UOJ #36

题意:求随机一个集合的子集的异或和的$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)$

  1. #include<ctime>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #define rt register int
  9. #define ll long long
  10. using namespace std;
  11. inline ll read(){
  12. ll x = ; char zf = ; char ch = getchar();
  13. while (ch != '-' && !isdigit(ch)) ch = getchar();
  14. if (ch == '-') zf = -, ch = getchar();
  15. while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
  16. }
  17. void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
  18. void writeln(const ll y){write(y);putchar('\n');}
  19. int i,j,k,m,n,x,y,z;unsigned ll cnt,c[],a[];
  20. namespace subtask1{
  21. bool b[];
  22. void main(){
  23. ll ans=;
  24. for(rt i=;i<=n;i++)for(rt j=;j<=;j++)if(a[i]>>j&)b[j]=;
  25. for(rt j=;j<=;j++)if(b[j])cnt+=(unsigned ll)<<j;
  26. cout<<(cnt/);if(cnt%)cout<<".5";
  27. }
  28. }
  29. namespace subtask2{
  30. bool b1[][],b2[][],b[];
  31. void main(){
  32. __int128 ans=;
  33. for(rt i=;i<=n;i++)
  34. for(rt j=;j<=;j++)
  35. for(rt k=;k<=;k++)if(j!=k){
  36. if(a[i]>>j&){
  37. if(a[i]>>k&)b1[j][k]=;else b2[j][k]=;
  38. b[j]=;
  39. }
  40. }
  41. for(rt i=;i<=;i++)
  42. for(rt j=i+;j<=;j++){
  43. __int128 all=;
  44. if(b1[i][j])all=;
  45. if(b1[i][j]&&(b2[i][j]||b2[j][i]))all=;
  46. if(b2[i][j]&&b2[j][i])all=;
  47. if(all)
  48. ans+=all**(1ll<<i)*(1ll<<j);
  49. }
  50. for(rt i=;i<=;i++)if(b[i])ans+=(unsigned ll)*(1ll<<i)*(1ll<<i);
  51. ans/=;write(ans/);
  52. if(ans&)cout<<".5";
  53. }
  54. }
  55. namespace subtask3{
  56. __int128 ans;
  57. __int128 mi(__int128 x,int y){
  58. __int128 ans=;
  59. for(rt i=;i<=y;i++)ans*=x;
  60. return ans;
  61. }
  62. void dfs(int x,__int128 y){
  63. if(x>n){
  64. ans+=mi(y,m);
  65. return;
  66. }
  67. dfs(x+,y);dfs(x+,y^a[x]);
  68. }
  69. void main(){
  70. ans=;dfs(,);
  71. for(rt i=;i<n;i++)ans/=;
  72. write(ans/);if(ans&)cout<<".5";
  73. }
  74. }
  75. int main(){
  76. n=read();m=read();
  77. for(rt i=;i<=n;i++){
  78. ll x=read();
  79. for(rt j=;j>=;j--)if(x>>j&){
  80. if(c[j])x^=c[j];
  81. else {
  82. c[j]=x;
  83. break;
  84. }
  85. }
  86. }
  87. n=;
  88. for(rt i=;i<=;i++)if(c[i])a[++n]=c[i];
  89. if(m==)subtask1::main();
  90. if(m==)subtask2::main();
  91. if(m>=)subtask3::main();
  92. return ;
  93. }

UOJ #36「清华集训2014」玛里苟斯的更多相关文章

  1. UOJ #36 -【清华集训2014】玛里苟斯(线性基+暴搜)

    UOJ 题面传送门 看到 \(k\) 次方的期望可以很自然地想到利用低次方和维护高次方和的套路进行处理,不过.由于这里的 \(k\) 达到 \(5\),直接这么处理一来繁琐,二来会爆 long lon ...

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

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

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

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

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

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

  5. UOJ #276「清华集训2016」汽水

    为什么你们常数都这么小啊 UOJ #276 题意:在树上找一条链使得|边权平均值$ -k$|尽量小,$ n<=5e4$ $ Solution:$ 首先二分答案$ ans$,即我们需要找一条链使得 ...

  6. UOJ #2321. 「清华集训 2017」无限之环

    首先裂点表示四个方向 一条边上都有插头或者都不有插头,相当于满足流量平衡 最大流 = 插头个数*2时有解 然后求最小费用最大流 黑白染色分别连原点汇点

  7. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  8. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  9. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

随机推荐

  1. (转)基于http协议的api接口对于客户端的身份认证方式以及安全措施

    由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的 jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在 ...

  2. Could not install the app on the device, read the error above for details. Make sure you have an Android emulator running or a device connected and have set up your Android development environment:

    Administrator@DESKTOP-EHCTIOR MINGW64 /d/react-native-eyepetizer (master) $ react-native run-android ...

  3. Fiddler安装证书

    1.打开Fiddler,点击工具栏中的Tools——>Fiddler Options…       2.切换到 HTTPS 选项卡,勾选 Capture HTTPS CONNECTs,勾选 De ...

  4. Luogu P2468 [SDOI2010]粟粟的书架

    一道二合一的题目.两部分思维难度都不太高,但是也都很巧妙.尤其是主席树的\(50\)分,由于本人初学主席树,所以没有见过主席树上二分的套路,就被小小的卡了一下.. \(n <= 200\) \( ...

  5. vue(基础二)_组件,过滤器,具名插槽

    一.前言 主要包括:  1.组件(全局组件和局部组件)                     2.父组件和子组件之间的通信(单层)                     3.插槽和具名插槽     ...

  6. python自动化开发-[第二十天]-form表单,CBV和FBV,序列化

    1.CBV和FBV的用法 2.序列化用法 3.form表单 一.CBV和FBV 1.cbv是 class based view(基于类),fbv是function based view(基于函数) 2 ...

  7. scp从远程指定目录拷贝文件到本地指定目录

    scp从远程指定目录拷贝文件到本地指定目录 [root@picts ~]# cat /root/scp_pictures.sh #!/bin/bash # Function: copy files f ...

  8. powershell 定时删除脚本

    powershell  定时删除脚本 $today=Get-Date #"今天是:$today" #昨天 #"昨天是:$($today.AddDays(-1))" ...

  9. java io系列09之 FileDescriptor总结

    本章对FileDescriptor进行介绍 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_09.html FileDescriptor 介绍 Fil ...

  10. netty的数据通信之心跳检测

    问题1:我们想实现客户端和服务端建立连接之后,5秒钟之后如果没有数据传输就关闭与客户端的连接. 解决办法:在服务端加上下面一条代码 ch.pipeline().addLast(new ReadTime ...