1 条题解

  • 0
    @ 2026-9-11 8:56:57

    直接对 2n2^n 个子集求和并逐个统计十进制中数字 4 的个数,在 n≤40n \le 40 时是不可行的(240≈10122^{40} \approx 10^{12})。

    为了优化计算,我们可以按十进制数位单独统计贡献:

    设 P=10kP = 10^k(k=0,1,2,…k = 0, 1, 2, \dots,分别对应个位、十位、百位……)。

    任何一个非负整数 SS 的第 kk 位数字(从右往左数第 kk 位,从 00 开始索引)等于 4,当且仅当:

    $$S \bmod 10^{k+1} \in [4 \times 10^k, \, 5 \times 10^k - 1]$$

    所以:所有子集和中数字 4 的总个数 $= \sum_{k=0}^{9} (\text{数位 } k \text{ 上数字为 4 的子集和个数})$。

    考虑折半搜索。将集合划分为两半:

    • 前半部分 n1=⌊n/2⌋n_1 = \lfloor n/2 \rfloor 个数,其所有子集和集合为 S1S_1。
    • 后半部分 n2=n−n1n_2 = n - n_1 个数,其所有子集和集合为 S2S_2。

    对于任意一对子集和 x∈S1,y∈S2x \in S_1, y \in S_2,整体子集和为 S=x+yS = x + y。根据模运算性质:

    $$(x + y) \bmod 10^{k+1} = \big((x \bmod 10^{k+1}) + (y \bmod 10^{k+1})\big) \bmod 10^{k+1}$$

    令 M=10k+1M = 10^{k+1},由于 0≤x mod M<M0 \le x \bmod M < M 且 0≤y mod M<M0 \le y \bmod M < M,加和 (x mod M)+(y mod M)(x \bmod M) + (y \bmod M) 的范围在 [0,2M−2][0, 2M - 2] 之间。

    因此,使 (x+y) mod M∈[4P,5P−1](x + y) \bmod M \in [4P, 5P - 1] 成立的条件等价于无取模加和落在以下两个互斥区间之一:

    1. 未产生模溢出:x mod M+y mod M∈[4P,5P−1]x \bmod M + y \bmod M \in [4P, 5P - 1]。
    2. 产生了一次模溢出:$x \bmod M + y \bmod M \in [4P + M, 5P - 1 + M] = [14P, 15P - 1]$。

    如果对每个数位 kk 都将 S1 mod MS_1 \bmod M 和 S2 mod MS_2 \bmod M 重新排序,单次排序复杂度为 O(2n/2log⁡2n/2)O(2^{n/2} \log 2^{n/2}),不一定好通过。

    但由于低位在之前的步骤中已经排序完成,根据最低位优先的基数排序:每次递增 kk 时,只需对 S1S_1 和 S2S_2 按照当前位数字 dk=⌊S/10k⌋ mod 10d_k = \lfloor S / 10^k \rfloor \bmod 10 进行一次稳定计数排序,复杂度仅为 O(2n/2)O(2^{n/2})。

    排序后,数组 A=S1 mod MA = S_1 \bmod M 和 B=S2 mod MB = S_2 \bmod M 自然保持有序。 利用双指针在两个有序数组中统计满足 L≤A[i]+B[j]≤RL \le A[i] + B[j] \le R 的 (i,j)(i, j) 对数,单次统计时间复杂度为 O(2n1+2n2)O(2^{n_1} + 2^{n_2})。

    • 1

    信息

    ID
    2730
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    35
    已通过
    5
    上传者