1 条题解

  • 0
    @ 2026-8-28 1:35:07

    题解

    思路

    由于 0≤ai<640\le a_i<64,任意子序列的按位与结果也只可能是 00 到 6363。可以按“当前按位与结果”统计子序列数量。

    做法

    小规模枚举所有非空子集,直接计算按位与。

    若数组全相等为 xx,任何非空子序列的按位与都为 xx;当 popcount(x)=k 时答案为 2n−12^n-1,否则为零。

    一般情况维护 dp[mask],表示处理过的元素中按位与恰为 mask 的非空子序列数。读入新元素 xx 时:原子序列可以不选 xx;单独选 xx 新增一个状态;每个旧状态 mask 选入 xx 后转移到 mask & x。全部过程对模数取模。

    正确性证明

    处理新元素时,每个非空子序列唯一地分为三类:不包含新元素、只包含新元素、包含新元素且此前已有元素。三类分别对应保留原状态、加入单元素状态、从 mask 转移到 mask & x,且互不重叠、覆盖全部子序列。归纳可知最终 dp[mask] 精确统计按位与为该掩码的非空子序列。求和所有 popcount 为 kk 的状态即为答案。

    复杂度分析

    每个元素遍历 64 个状态,时间复杂度 O(64∑n)O(64\sum n),空间复杂度 O(64)O(64)。

    • 1

    信息

    ID
    1129
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者