bzoj 3811: 玛里苟斯

3811: 玛里苟斯

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 190  Solved: 95
[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


首先,对于题目的答案小于263,我们可以看出对于不同的k,ai是不同的:

k=1,ai<263
k=2,ai<232
k=3,ai<221
k=4,ai<216
k=5,ai<213

首先,因此我们依据数据范围,对于不同的ai有不同的解法。

其次,题目要求输出精确的小数,由以下推导我们可以知道,小数最多只有.5,不可能存在.25,.125这样的:

对于求出来了其中一种情况x,他对答案的贡献是xk*p,其中p是该情况出现的概率。
我们以x=2为例,其他k的情况类似:
我们把这个x按二进制分成了最多n位,也就是最大的数的最高位为n。那么他的k次方是(w0*20+w1*21+w2*22……+wn*2n)*(w0*20+w1*21+w2*22……+wn*2n),展开就是w0*w0*20*20+w0*w1*20*21……wn*wn*2n*2n。其中wi是它每个二进制位的值。
对于每个项wi*wj*2i+j,他存在的情况是wi为1且wj为1,也就是该位异或和为1。那么他的存在的概率为P/2N(N为输入的数列数字数),P为该两位皆为1的情况数。
证明题外话:对于数列,我们可以先做个线性基,把线性相关的数字去掉,剩下的都是线性无关的数,这样方便处理。
我们可以构造一个异或(%2)的增广矩阵来求解这样的一个P的数量,x1~xn,即xi代表这个数字是否在集合中,作为一个行向量X,把所有数字按按二进制位分解,每个数字占一列,构造一个矩阵MART.
那么我们求解的是X*MART=ANS,ANS为一个行向量,只有你要求的对应位为1,其余为0。
假如我们求解的是i位和j位,我们的矩阵对应方程差不多是这样的:
(2333 此处^为异或)
x1*w(1,0)^x2*w(2,0)^x3*w(3,0) ……^xN*w(N,0) =0;
x1*w(1,1)^x2*w(2,1)^x3*w(3,1) ……^xN*w(N,1) =0;
……
x1*w(1,i)^x2*w(2,i)^x3*w(3,i) ……^xN*w(N,i) =1;
……
x1*w(1,j)^x2*w(2,j)^x3*w(3,j) ……^xN*w(N,j) =1;
……
x1*w(1,n)^x2*w(2,n)^x3*w(3,n) ……^xN*w(N,n) =0;
下面还有N-n个方程,对应更高位。毕竟是个矩阵嘛行数等于列数,但它们的w全为0,等号右边也为0,对求解无影响就不列举了。

其中w(i,j),j代表数列第i个数字的第j位。
我们经过高斯消元以后弄成上三角,可以得出有t个f[i][i]非零的行,那么只有这t个xi是有唯一解的,其他的xi有多解。因为%2,所以其他xi有2解,那么总共就有2N-t个解,即P=2N-t;
那么wi*wj存在的概率为p/2N=1/(2t);
那么每项对答案的贡献为2i+j-t
对于i≠j,i+j≥1,t≤2,因此最多小数点后1位.5。
对于i==j,上述方程只有一行初始为1,所以t≤1,i+j≥0,也是最多.5。
上述结论扩展成k=n的情况,无非是方程等于1的行增加为n。
如果我们求解的位(wi*wj*wt.....)中有k位不同,那么方程等于1的行就缩小为k行,因此i+j+t....≥0+1+……k-1=k*(k-1)/2>=k-1=t-1,k≥2。
∴Σp-t>=-1,p为所求解对应位的位号。对应k=2的贡献2i+j-t,K=n贡献为2Σp-t>=2-1。所以最多有一位小数.5。
k=1显而易见最多/2所以k=1也是最多也是.5。
至此证明完毕。

接下来我们对应数据范围,提出三种不同范围下的解法:

k=1时,就求x的期望,它是线性的。对于所有数的所有子集的异或和,我们从他们某个二进制位看。如果有数字该位为1,那么该位有奇数个1和偶数个1的概率是相等的,皆为1/2。为奇数个为该位为1的情况,为1/2。如果没有则不可能为1,该位始终为0。
那么我们只要把每个数字或一下,然后乘1/2就是答案了。

k=2时,就要按位做了。先做个线性基剔除线性无关的向量。然后把在线性基每位唯一化(即消消元弄成每位上只有一个数字有1),这样做方便处理独立性。按照上面证明的展开,那么对于两位i,j,由k=1可得,如果这两位独立的话(即不在同一个数字中相应位为1),那么等概率出现(0,0),(0,1),(1,0),(1,1),(1,1)即wi,wj存在的概率为1/4,不独立的话只可能等概率出现(0,0)和(1,1),(1,1)概率为1/2。
那么枚举32位*32位,算算他们均为1的概率P*2i+j,作为答案贡献加入答案中。

k≥3时,由于ai<221 ,即使枚举0~ai也最多百万级别的时间复杂度。我们可以类似线性基求第k小枚举出所有可能出现的数字。于是我们可以考虑做完线性基后,唯一化,构造新数组存不为0的元素中。
然后枚举每个数是否加入异或贡献中,这样可以求出所有数异或的所有值了。借用之前题目的结论,每个不同的异或值有P=2n-|μ|选择元素的方法,n为原本数组个数,|μ|为新构造的数组个数。那么每个值出现的概率就是P/总选择方法数=P/(2n)=1/(2|μ|)的概率,值 乘 概率即为对答案的贡献。
这里需要做个两位的高精来保证数字不出现错误。

时间: 2024-10-10 07:02:26

bzoj 3811: 玛里苟斯的相关文章

bzoj 3811 玛里苟斯 - 线性基

题目传送门 传送门I 传送门II 题目大意 给定集合$S$,问集合$S$的任意选一个子集的异或和的$k$次幂期望. 保证答案在$2^{63}$内. 注意到答案在$2^{63}$内,所以,当$k \geqslant 3$的时候,$a_{i} \leqslant 2^{21}$,这意味着本质不同的异或结果至多$2^{21}$个. 于是可以做线性基,然后暴力枚举子集计算异或和$k$次幂. 注意答案在$2^{63}$内,但是中间结果会溢出.所以用两个unsigned long long来压成__int1

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列

【BZOJ】【1016】【JSOI2008】最小生成树计数

Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的,再加上权值为2和2的,不也满足题意吗?事实上,如果这样的话……最小生成树应该是1和2,而不是1和3或2和2!!! 所以呢?所以对于一个图来说,最小生成树有几条边权为多少的边,都是固定的!所以我们可以做一遍Kruskal找出这些边权,以及每种边权出现的次数.然后,对于每种边权,比方说出现了$v_i$

【BZOJ】【2844】albus就是要第一个出场

高斯消元解XOR方程组 srO  ZYF  Orz 膜拜ZYF…… http://www.cnblogs.com/zyfzyf/p/4232100.html 1 /************************************************************** 2 Problem: 2844 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:252 ms 7 Memory:2052 kb 8 *******

[BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 i1 到 i2 连一条边,容量为这个石柱 i 的高度,即跳跃次数限制.来到这个石柱就是向 i1 连边,从这个石柱跳起就是从 i2 向外连边,这样只要从石柱 i 跳起就一定会消耗 i1 到 i2 的边的容量.如果 i 有蜥蜴,就从 S 到 i1 连一条容量为 1 的边,如果从石柱 i 能跳出边界,就从