题目

传送门 to usOJ

题目概要
对于可重集合 SSS ,设其元素个数为 nnn ,显然它有 2n2^n2n 个子集。定义集合的权值为其中元素的异或和,求子集的权值的 kkk 次方的期望。即:∑s⊆Sf(s)k2n\frac{\sum_{s\subseteq S}f(s)^k}{2^n}2n∑s⊆S​f(s)k​ 的值,f(s)f(s)f(s) 是集合内元素的异或和。

数据范围与约定
n≤105,k≤5n\le 10^5,k\le 5n≤105,k≤5 。

思路

FBLWARNING:我将试着使用奇怪的文风去论述这个问题。\bf{FBL\;\;WARNING}:我将试着使用奇怪的文风去论述这个问题。FBLWARNING:我将试着使用奇怪的文风去论述这个问题。

刚看一眼,就被这道题给吓住了,nnn 很大,kkk 却小的可怜,555 站在 10510^5105 旁边,显得毫不起眼。但我们不着眼于出题人的区别对待,我们要拯救每一个 kkk ,让世界重新充满爱。

  • k=1k=1k=1 的时候,这道题变得平淡无奇,味同嚼蜡。所有的 fff 中,有一半都满足第 iii 位是一个 111 ,只要 SSS 中存在一个数字可以提供这个 111 。这是因为,这个数字是否出现,这件事不影响别人,它只负责自己的选择,就像 zxyzxyzxy 默默的 AKAKAK 。若夫它看到是 000 ,它便义无反顾地将自己融入整个群体;至若此值已经为 111 ,它不会出现在人们的视野中,好像从未出现过,又好像一直都在。
  • k=2k=2k=2 的时候,我们要做的是一个平方的选择。两个元素,虽然不在一个括号中,但是二人的心却在一起,这就是平方的真谛。二者何人?枚举则知。不是所有人都能够相遇,就像人生总会有很多遗憾。如果二者可以被独立抉择——存在一个数字,在第 iii 位为 111 而第 jjj 位为 000 ——那么二人是不容易遇到的,只有 12×12=14\frac{1}{2}\times\frac{1}{2}=\frac{1}{4}21​×21​=41​ 。如果不是独立抉择,就会翻倍,得到 12\frac{1}{2}21​ 了。
  • k≥3k\ge 3k≥3 的时候,我们终于可以大展拳脚了。我们有很多方法。我们可以利用答案小于 2632^{63}263 的特点,直接猜到 a≤222a\le 2^{22}a≤222 次方,求出线性基,然后暴力枚举。我们也可以继续学习 k=2k=2k=2 的方案。

我改悔了。

对于 k=2k=2k=2 ,我们拆位,将一个数字拆成很多个 222 的幂之和。然后平方就是选两个二进制位呗。


假设最大的一个二进制位是 2x2^x2x ,那么至少有一半的异或和不小于 2x2^x2x ,与 k=1k=1k=1 的情况类似。

所以答案至少有 12⋅(2x)k<263\frac{1}{2}\cdot(2^x)^k<2^{63}21​⋅(2x)k<263 ,可以解出 x<64kx<\frac{64}{k}x<k64​ ,然后就没了。

作乘法可能会爆 unsignedlonglongunsigned\;long\;longunsignedlonglong ,稍微打的骚一点就好了。

代码

// 湘妹儿,永远滴神!
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
typedef unsigned long long int_;
int_ readint(){int_ x; scanf("%llu",&x);return x; // cin就能兼容了[滑稽]
}int_ d[100];
void insert(int_ x){for(int i=63; i>=0&&x; --i)if(x>>i&1){if(d[i] == 0)d[i] = x;x ^= d[i];}
}int n, k, cnt; // 分母是pow(2,cnt)
int_ zheng, xiao; // 整数与小数
void dfs(int t,int_ now){if(t == -1){int_ res = 1; // 加入res*nowfor(int i=1; i<k; ++i)res *= now;int_ yu = res%(1<<cnt);res = res/(1<<cnt);// 变成了res*(1<<cnt)+yuzheng += res*now;xiao += yu*now;zheng += xiao/(1<<cnt);xiao = xiao%(1<<cnt);return ;}if(d[t]) dfs(t-1,now);dfs(t-1,now^d[t]);
}
int main(){n = readint(), k = readint();for(int i=0; i<n; ++i)insert(readint());int_ all = 0;for(int i=63; i>=0; --i)all |= d[i];if(k == 1){cnt = 1;zheng = all>>1;xiao = all&1;}if(k == 2){cnt = 2;for(int i=32; i>=0; --i)if(all>>i&1)for(int j=32; j>=0; --j)if(all>>j&1){bool apart = false;for(int o=32; o>=0; --o)if((d[o]>>i&1)^(d[o]>>j&1)){ apart = true; break; }int mom = (apart ? 1 : 0)+1;if(i+j >= mom)zheng += (1ull<<(i+j-mom));elsexiao += 1ull<<(i+j+cnt-mom);// 为了让分母pow(2,mom->cnt)zheng += xiao/(1<<cnt);xiao = xiao%(1<<cnt);}}if(k >= 3){for(int i=0; i<=63; ++i)if(d[i] > 0) ++ cnt;dfs(63,0);}printf("%llu",zheng);if(xiao) putchar('.');while(xiao *= 10){printf("%llu",xiao/(1<<cnt));xiao %= (1<<cnt);}return 0;
}

[BZOJ3811]玛里苟斯相关推荐

  1. BZOJ3811: 玛里苟斯

    BZOJ3811: 玛里苟斯 https://lydsy.com/JudgeOnline/problem.php?id=3811 分析: \(K=1\)可以随便做,每一位的贡献都是确定的,推一推可以发 ...

  2. bzoj3811 玛里苟斯

    分三种情况讨论 k=1时,对于每一位而言,只要有一个数这一位是1,那么这个就有0.5的概率是1,选他就是1,不选就是0,有第二个的话,在第一个选或不选的前提下,也各有0.5的几率选或不选,0和1的概率 ...

  3. 从我的游戏成瘾中恢复

    重点 (Top highlight) I can play a video game for just an hour these days and then stop. I have no prob ...

  4. 自行车改装电动车怎么样_电动车听起来应该是什么样?

    自行车改装电动车怎么样 The sound of an all-electric car accelerating doesn't have to sound like a standard comb ...

  5. 【BZOJ3811】玛里苟斯(线性基)

    [BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...

  6. 【清华集训2014】【BZOJ3811】玛里苟斯

    Description 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集 A={ai1,- ...

  7. 【BZOJ3811】【清华集训2015】玛里苟斯(线性基)

    传送门 解析: 还是挺好想的,首先对于k=1的情况,如果某一个数在这一位上有1,那么最终结果中这一位为1的概率就是0.5. 有一个很显然的性质,所有异或结果出现概率(或者说方案数)相同. 其次,对于k ...

  8. [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)

    Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...

  9. [BZOJ 3811]玛里苟斯(线性基)尽量理解的题解

    文章目录 title solution code title 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随 ...

最新文章

  1. 2017年智能家居将从概念走进现实
  2. RCNN SPP-net Fast-RCNN Faster-RCNN
  3. 函数中返回char *类型
  4. Silverlight与HTML双向交互
  5. 清晰!我们从来都反对“大中台,小前台”的架构设计!
  6. Net框架下-ORM框架LLBLGen的简介(转载)
  7. 【原创】大叔问题定位分享(33)beeline连接presto报错
  8. pph上传文件到window服务器,[upload_labs]文件上传绕过小结
  9. 下一代操作系统与软件
  10. php文件锁不起作用,php文件锁产生的问题和解决方案(一个真实案例)
  11. 《人月神话(The Mythical Man-Month)》看清问题的本质:如果我们想解决问题,就必须试图先去理解它...
  12. 三星手机回归中国市场,对中国手机高端化之路是又一个重大打击
  13. 小米实习生测试开发笔试题
  14. uedit的简单使用案例
  15. UA OPTI570 量子力学23 角动量基础
  16. 6. Z 字形变换(给定字符串,画N后逐行拼接成新字符串)
  17. DPABISurf使用教材
  18. 设置邮件规则,轻松整理你的收件箱!
  19. JS实现简单农场小游戏
  20. PS基础教程[7]如何为照片瘦身

热门文章

  1. FCRA部分考试题目及答案
  2. 第八周---FPGA流水灯显示和串口循环输出实验
  3. Unity 2D精灵分割图片注意事项
  4. 01组-2022软工K班现场编程任务
  5. DF-GAN: A Simple and Effective Baseline for Text-to-Image Synthesis论文解读
  6. 9.15蚂蚁金服hr面
  7. 方案设计阶段目标成本形成过程
  8. 2012-2013-1 (实变函数56, 高等数学84)
  9. Modbus对接 - Java
  10. 刚刚!阿里香港上市,他们的区块链和百度、腾讯有什么不同?