1 条题解
-
3
对于一个非空子集 ,其所有元素的最小公倍数为 $2^{\max_{j \in S} a_j} \times 3^{\max_{j \in S} b_j}$。
如果我们直接枚举子集,复杂度将是 ,显然无法接受。我们可以改变思路:按最大值元素进行归类计算。
将所有元素按照 升序排列;如果 相同,则按 升序排列。
排序后,我们假设子集中最靠后的元素下标为 。那么由于排序的性质,该子集的最大 值必定为 。
这就把所有的非空子集完美划分成了 个不重不漏的类:对于固定的 ,子集必定包含元素 ,且其余元素只能从 到 中选取。
当最大元素下标固定为 时,该子集的 维度最大值是 。那么 维度的最大值是什么呢?
包含元素 的子集 维度的最大值为 。
我们需要在所有由 组成的子集中,对 求和。
我们将前 个元素的 值集合记为 。对于 中的元素:
- 所有 的元素,无论是否选入子集,都不会超过 。如果共有 个这样的元素,它们会产生 种组合,对这 种子集而言, 的最大值均为 。
- 对于 中 的元素,如果选了它们,最大值就会由它们决定。我们将 中 的元素从小到大排列,如果子集中的最大值恰好排在第 位(即前面有 个比它小的数),那么共有 种子集能以它为最大值。
使用一棵线段树,以离散化后的 值为下标,动态维护集合 中元素的分布情况。线段树的每个节点维护两个值:
cnt:区间内当前存在的元素个数。val:区间内所有元素若作为最大值时,提供的权值之和,即 。
时,左子树的元素一定小于右子树的元素。因此,右子树中的元素在整个区间内排名时,前面会额外多出左子树的
$$val = (left.val + right.val * 2^{left.cnt}) \pmod{10^9+7}$$cnt个元素。以样例 为例:
3个数,分别为(1, 2), (2, 1), (1, 2)。排序后:
1: (1,2)、2: (1,2)、3: (2,1)。- 处理第 1 个数 (1, 2):当前树为空,。大于 的部分也为空。该数构成的组合值为 。乘以 得到 。将 插入线段树,线段树中
b=2节点cnt=1, val=9。总和ans = 18。 - 处理第 2 个数 (1, 2):查询 的元素个数 。大于 的部分为空。组合值为 。乘以 得到 。将 再次插入线段树,此时
b=2节点cnt=2,利用合并公式val = 9 + 9 * 2^1 = 27。总和ans = 18 + 36 = 54。 - 处理第 3 个数 (2, 1):查询 的元素个数 。大于 的部分有
b=2的节点,其返回val=27。组合值为 。乘以 得到 。将 插入线段树。总和ans = 54 + 120 = 174。
信息
- ID
- 2751
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 15
- 已通过
- 7
- 上传者