Kimi LeetCode 3757. 有效子序列的数量 Java实现

📅 2026/7/29 8:06:28
Kimi    LeetCode 3757. 有效子序列的数量 Java实现
以下是 LeetCode 3757. 有效子序列的数量 的 Java 实现包含详细注释说明。解题思路核心转化一个子序列 S 是有效的当且仅当删除它后剩余元素的按位或严格减少。设 totalOr 为整个数组的按位或。对于子序列 S设剩余元素为 R则- S 有效 \iff OR(R) totalOr正难则反计算无效的子序列数即 OR(R) totalOr 的情况再用总数减去它。- 总非空子序列数2^n - 1- 无效子序列数 满足 OR(R) totalOr 的 S 的数量- 注意R 是 S 的补集R 可以是空序列此时 S 为全数组是有效的通过 SOS DP子集和动态规划 容斥原理 计算 OR 恰好等于 totalOr 的子序列数。Java 代码javaclass Solution {private static final int MOD 1_000_000_007;public int countEffective(int[] nums) {int n nums.length;// Step 1: 计算整个数组的按位或int totalOr 0;for (int num : nums) {totalOr | num;}// Step 2: 确定需要的二进制位数// nums[i] 10^6 2^20最多 20 位int width totalOr 0 ? 1 : Integer.SIZE - Integer.numberOfLeadingZeros(totalOr);int maxMask 1 width;// Step 3: cnt[mask] 值恰好等于 mask 的元素个数int[] cnt new int[maxMask];for (int num : nums) {cnt[num];}// Step 4: SOS DPSum Over Subsets// 完成后cnt[mask] 满足 (x | mask) mask 的元素 x 的个数// 即 x 的所有二进制位都是 mask 位的子集for (int bit 0; bit width; bit) {for (int mask 0; mask maxMask; mask) {if ((mask (1 bit)) ! 0) {cnt[mask] cnt[mask ^ (1 bit)];}}}// Step 5: 预处理 2 的幂次long[] pow2 new long[n 1];pow2[0] 1;for (int i 1; i n; i) {pow2[i] (pow2[i - 1] * 2) % MOD;}// Step 6: 容斥原理计算 OR 恰好等于 totalOr 的子序列数// exact[totalOr] Σ_{sub ⊆ totalOr} (-1)^(|totalOr| - |sub|) * (2^cnt[sub] - 1)long exact 0;int totalBits Integer.bitCount(totalOr);// 枚举 totalOr 的所有子集 subfor (int sub totalOr; ; sub (sub - 1) totalOr) {int bitsInSub Integer.bitCount(sub);// 符号根据 (totalBits - bitsInSub) 的奇偶性int sign ((totalBits - bitsInSub) 1) 0 ? 1 : -1;// 从 cnt[sub] 个元素中任选非空子集的方案数long ways (pow2[cnt[sub]] - 1 MOD) % MOD;if (sign 1) {exact (exact ways) % MOD;} else {exact (exact - ways MOD) % MOD;}if (sub 0) break; // 枚举完所有子集}// Step 7: 答案 2^n - exact[totalOr]// 即所有子序列 - OR(剩余) totalOr 的情况long ans (pow2[n] - exact MOD) % MOD;return (int) ans;}}复杂度分析项目 复杂度时间 O(n W \cdot 2^W 2^{空间 O(2^W n)主要为 SOS DP 数组和幂次数组关键技巧说明1. SOS DP通过高维前缀和快速计算每个 mask 有多少个元素是它的子集2. 子集枚举for (int sub totalOr; ; sub (sub - 1) totalOr) 高效遍历所有子集3. 容斥原理通过莫比乌斯反演思想从子集信息反推精确等于的计数