3757:有效子序列的数量(2519 分)
目录
题目
给你一个整数数组 nums。
数组的 强度 定义为数组中所有元素的 按位或 (Bitwise OR) 。
如果移除某个 子序列 会使剩余数组的 强度严格减少 ,那么该子序列被称为 有效子序列 。
返回数组中 有效子序列 的数量。由于答案可能很大,请返回结果对 109 + 7 取模后的值。
子序列 是一个 非空 数组,它是由另一个数组删除一些(或不删除任何)元素,并且不改变剩余元素的相对顺序得到的。
空数组的按位或为 0。
示例 1:
输入: nums = [1,2,3]
输出: 3
解释:
- 数组的按位或为
1 OR 2 OR 3 = 3。 - 有效子序列为:
[1, 3]:剩余元素[2]的按位或为 2。[2, 3]:剩余元素[1]的按位或为 1。[1, 2, 3]:剩余元素[]的按位或为 0。
- 因此,有效子序列的总数为 3。
示例 2:
输入: nums = [7,4,6]
输出: 4
解释:
- 数组的按位或为
7 OR 4 OR 6 = 7。 - 有效子序列为:
[7]:剩余元素[4, 6]的按位或为 6。[7, 4]:剩余元素[6]的按位或为 6。[7, 6]:剩余元素[4]的按位或为 4。[7, 4, 6]:剩余元素[]的按位或为 0。
- 因此,有效子序列的总数为 4。
示例 3:
输入: nums = [8,8]
输出: 1
解释:
- 数组的按位或为
8 OR 8 = 8。 - 只有子序列
[8, 8]是有效的,因为移除它会使剩余数组为空,按位或为 0。 - 因此,有效子序列的总数为 1。
示例 4:
输入: nums = [2,2,1]
输出: 5
解释:
- 数组的按位或为
2 OR 2 OR 1 = 3。 - 有效子序列为:
[1]:剩余元素[2, 2]的按位或为 2。[2, 1](包括nums[0]和nums[2]):剩余元素[2]的按位或为 2。[2, 1](包括nums[1]和nums[2]):剩余元素[2]的按位或为 2。[2, 2]:剩余元素[1]的按位或为 1。[2, 2, 1]:剩余元素[]的按位或为 0。
- 因此,有效子序列的总数为 5。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 106
分析
- 设所有元素的或为 s,显然 s 二进制为 0 的位无意义,针对有意义的位将所有元素压缩,新的 s 二进制位都为 1,设一共有 L 位
- 即是要求子序列 a 的个数,使得其或 or(a)< s
- 根据容斥定理,即是 sum(or(a)在第 i 位为 0 的个数))-sum(or(a)在第 i、j 位为 0 的个数和)+…
- 令 g(u) 代表 or(a)是 u 的子集的序列 a 的个数,若能求出每个 g(u),即可带入容斥公式求解
- 针对 u,只要元素 x 的二进制是 u 的子集,x 就可以选,因此 g(u)=pow(2,u的子集的个数)
- 而 u 的子集个数即是经典的 sosdp 问题
解答
|
|
4267 ms