题目
这可算是描述很简单的一道题了!但是不简单。
\(S\)是一个可重集合,\(S = \{a_1, a_2, \dots, a_n \}\)。
等概率随机取\(S\)的一个子集\(A = \{a_{i_1}, \dots, a_{i_m}\}\)。
计算出\(A\)中所有元素异或\(x\), 求\(x^k\)的期望。
要点
要点 1
所有异或出来的不同结果的数量是同样多的(这句话可能有点不清楚)。
我的意思是说,假如异或出来的结果有\(5\)、\(3\)、\(4\),那么结果是\(5\)的异或方案数量是等于结果是\(3\)的异或方案数量的,也是等于结果是\(4\)的异或方案数量的。
除此之外,如果
设异或结果为\(0\)的子集(包括空集)数量为\(n\),那么如果异或出来的结果有\(x\),那么一定恰好有\(n\)种方案使得异或出来的结果是\(x\)。
要点 2 \(a_i\)的大小
设其大小为\(2^m-1\),说白了就是化成二进制后有多少位。
那么\[(2^m-1)^k \leqslant answer < 2^{63}\]
即\[2^{mk} \leqslant 2^{63}\]
就是\[m \leqslant \frac {63} {k}\]
算法
算法 1
根据要点1,很容易想到高斯消元。消元后直接暴力即可,不过这个时间复杂度是 \(O(2^m)\)。只能通过\(60 \%\)的数据。
算法 2
设\(P = \lbrace a_1, a_2, \dots, a_{2^n} \rbrace\),它的元素就是\(A\)中所有元素异或,所以它的大小为\(2^n\)。
那么答案为\[\frac {\sum_{i=1}^{2^n} {{a_i}^k}} {2^n}\]
由于\(a_i\)化成二进制后位数比较少,所以用\(b_{i,j}\)表示\(a_i\)化成二进制后的第\(j\)位。
那么答案可以写成\[\frac {\sum_{i=1}^{2^n} ({{\sum_{j=0}^{m} { b_{i,j} \cdot 2^j }}})^k} {2^n}\]
现在假设\(k=2\),有:\[\frac {\sum_{i=1}^{2^n} ({{\sum_{j=0}^{m} \sum_{p=0}^{m} {} { b_{i,j} \cdot b_{i,p} \cdot 2^{j+p} }}})} {2^n}\]
也就是:\[\sum_{j=0}^{m} \sum_{p=0}^{m}( \frac {\sum_{i=1}^{2^n} { b_{i,j} \cdot b_{i,p} }} {2^n}\cdot 2^{j+p})\]
对于\(\frac {\sum_{i=1}^{2^n} { b_{i,j} \cdot b_{i,p} }} {2^n}\),是可以在\(O(n)\)的时间复杂度内算出来的!如果\(j=p\),那么这个值为第\(j\)为\(1\)的概率,如果\(j\neq p\),那么这个值为第\(j\)和第\(p\)同时为\(1\)的概率,这个用一个迭代可以算出(根据要点1,算出最终所有可能出现的异或结果,这里的异或结果是指第\(j\)位和第\(p\),只有4种结果)。
当\(k \neq 2\)时,原理一样!
这样子,我们就可以在\(O(m^k \cdot (n + (2^k)^3))\)内算出\(answer\)了。
k | m | 总复杂度(估算) |
---|---|---|
1 | 63 | 63 |
2 | 31 | 61504 |
3 | 21 | 4741632 |
4 | 15 | 207360000 |
5 | 12 | 8153726976 |
好吧,你会发现迭代的时间复杂度有点高!事实上可以利用高斯消元后的独立数进行推导同时出现\(1\)的概率。
这样的话,时间复杂度就是\(O(m^k \cdot m)\)了。