type
status
date
slug
summary
tags
category
icon
password
创建时间
Feb 11, 2025 08:10 AM
一个数组的 异或总和 定义为数组中所有元素按位
XOR
的结果;如果数组为 空 ,则异或总和为 0
。- 例如,数组
[2,5,6]
的 异或总和 为2 XOR 5 XOR 6 = 1
。
给你一个数组
nums
,请你求出 nums
中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。注意:在本题中,元素 相同 的不同子集应 多次 计数。
数组
a
是数组 b
的一个 子集 的前提条件是:从 b
删除几个(也可能不删除)元素能够得到 a
。位运算——拆位 / 贡献法
这道题的思维过程十分有意思。
假设一共有 n 个元素(数组大小为 n)。我们拆位来看,考虑第 k 位的情况,这一位一共有 m 个元素是 1,则第 k 位的有 n - m 个元素为 0。
对于一个子集,只有其中该位的异或结果为 1,才会对最后的结果有影响。也就是该子集中选中奇数个该位为 1 的元素,而其他元素在该位为0的可以任意选或者不选。因此,有效的子集数量为:
而根据二项式定理,我们可以得到:。
推导过程:根据二项式定理:令 a = 1, b = 1,得展开之和:令 a = 1, b = -1,得展开之和: 。接着得:所以,奇数项之和 = 偶数项之和 = 。
则
得到了与 m 无关的数。也就是说 count 与当前位有多少个 1 无关。
而第 k 位对最后的贡献是 (注:只有在当前位至少存在一个 1 时,才有贡献,否则为 )。
因此,所有位的贡献是 。
因此,我们将所有的数进行与操作,最后乘上 ,也就是向右移 n - 1 位。
📎 参考
- 无