2527.查询数组异或美丽值
题目描述:
给你一个下标从 0 开始的整数数组 nums
。
三个下标 i
,j
和 k
的 有效值 定义为 ((nums[i] | nums[j]) & nums[k])
。
一个数组的 异或美丽值 是数组中所有满足 0 <= i, j, k < n
的三元组 (i, j, k)
的 有效值 的异或结果。
请你返回 nums
的异或美丽值。
注意:
val1 | val2
是val1
和val2
的按位或。val1 & val2
是val1
和val2
的按位与。
数据范围:
$1\le nums.len \le 10^5, 1\le nums[i] \le 10^9$
题解:
统计每一位上 $0$ 的个数 $cnt0$ 和 $1$ 的个数 $cnt1$ 。
然后对每一位分别考虑贡献是多少。因为可以重复选取,每一个数可以被选取多次。而且是每一位上的异或值,因此只需要计算每一位上最终 $1$ 的个数是奇数还是偶数。如果一个三元组该位为 $1$ ,那么 $nums[k]$ 必为 $1$ , $nums[i],nums[j]$ 不能同时为 $0$ ,因此种类数为 $cnt1 \times (cnt01 cnt01 - cnt0 cnt0)$ ,即减去同时为 $0$ 的。
化简之后为 $cnt1 \times ((cnt1 + cnt0 + cnt0) \times cnt1) = cnt1 \times cnt1 \times (2\times cnt0 + cnt1) = 2\times cnt0 \times cnt1^2 + cnt1^3$
由于 $2\times cnt0 \times cnt1^2$ 一定为偶数,因此奇偶性只与 $cnt1^3$ 有关,只与 $cnt1$ 有关。
也就是只与最终每一位上的 $1$ 的奇偶有关,这就是直接异或了。
代码:
1 | auto optimize_cpp_stdio = []() |