🗒️1863. 找出所有子集的异或总和再求和
2025-2-11
| 2025-2-11
0  |  阅读时长 0 分钟
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 位。

📎 参考

  • 【题单】位运算
  • Important
  • 3153. 所有数对中数位差之和2275. 按位与结果大于零的最长组合
    Loading...