1 条题解
-
0
直接对 个子集求和并逐个统计十进制中数字
4的个数,在 时是不可行的()。为了优化计算,我们可以按十进制数位单独统计贡献:
设 (,分别对应个位、十位、百位……)。
任何一个非负整数 的第 位数字(从右往左数第 位,从 开始索引)等于
$$S \bmod 10^{k+1} \in [4 \times 10^k, \, 5 \times 10^k - 1]$$4,当且仅当:所以:所有子集和中数字
4的总个数 $= \sum_{k=0}^{9} (\text{数位 } k \text{ 上数字为 4 的子集和个数})$。考虑折半搜索。将集合划分为两半:
- 前半部分 个数,其所有子集和集合为 。
- 后半部分 个数,其所有子集和集合为 。
对于任意一对子集和 ,整体子集和为 。根据模运算性质:
$$(x + y) \bmod 10^{k+1} = \big((x \bmod 10^{k+1}) + (y \bmod 10^{k+1})\big) \bmod 10^{k+1}$$令 ,由于 且 ,加和 的范围在 之间。
因此,使 成立的条件等价于无取模加和落在以下两个互斥区间之一:
- 未产生模溢出:。
- 产生了一次模溢出:$x \bmod M + y \bmod M \in [4P + M, 5P - 1 + M] = [14P, 15P - 1]$。
如果对每个数位 都将 和 重新排序,单次排序复杂度为 ,不一定好通过。
但由于低位在之前的步骤中已经排序完成,根据最低位优先的基数排序:每次递增 时,只需对 和 按照当前位数字 进行一次稳定计数排序,复杂度仅为 。
排序后,数组 和 自然保持有序。 利用双指针在两个有序数组中统计满足 的 对数,单次统计时间复杂度为 。
- 1
信息
- ID
- 2730
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 35
- 已通过
- 5
- 上传者