1 条题解
-
0
题解:中二病DNA疫苗问题
问题核心
给定环形DNA的段和距离阈值,需解决两个问题:
- 不考虑旋转,求满足“任意两段距离≥”的非空子集数(记为)。
- 考虑旋转等价(旋转后相同的子集算一种),求本质不同的非空子集数(记为)。
距离定义:两段中间隔的最少段数,如第段与第段距离为;答案需对(记为)取模。
一、求解:不考虑旋转的非空子集数
关键思路:线性→环形转化
环形的约束比线性更紧(需额外保证第段与第段的距离≥),因此先计算线性情况的独立集数目,再修正为环形。
1. 线性情况的独立集数目(含空集)
定义为“线性排列的段DNA,满足任意两段距离≥的子集数(含空集)”,递推关系如下:
- 递推公式:
解释:对第段,有两种选择——不选(则前段的子集数为);选(则前段不能选,子集数为)。 - 边界条件:(若,视为空集的特殊情况);(空集本身)。
2. 环形情况的独立集数目(含空集)
定义为“环形排列的段DNA,满足条件的子集数(含空集)”。环形需排除“线性中合法但第段与第段距离<”的子集:
- 第段与第段的距离恒为,因此仅当时,需排除“同时包含第段和第段”的线性子集。
- 这类子集的数目为(中间段的独立集数,含空集;若,取)。
因此:
- 若:所有子集均满足条件,(因时递推为)。
- 若:(需保证结果非负,可加后再取模)。
3. 计算
含空集,因此非空子集数为:
二、求解:本质不同的非空子集数
关键工具:Burnside引理
旋转等价类数目 = 所有旋转操作的不动点子集数的平均值。旋转群含个操作(旋转个位置),步骤如下:
1. 不动点子集数(旋转个位置)
对旋转,记(循环个数),(每个循环的长度)。不动子集需满足“选整个循环或不选”,且循环内/间满足距离约束:
- 若:循环内段的距离为,选循环会违反条件,因此仅空集合法,。
- 若:循环内段的距离≥,合法。此时选择循环的问题等价于“长度为的环形DNA的独立集数(含空集)”,即(同的定义,仅将替换为),因此。
2. 按约数分组计算总和
必为的约数,对每个约数,统计满足的的个数(即,欧拉函数),则所有旋转的不动点子集数总和为:
$$sum_C = \sum_{d | n} \left[ \begin{cases} \phi(n/d) \times 1 & (d < k) \\ \phi(n/d) \times g(d) & (d ≥ k) \end{cases} \right] \mod MOD$$3. 计算
- 所有子集(含空集)的本质不同数目:,其中是在下的逆元(因是质数,)。
- 减去空集的等价类(1个),得:
三、预处理与复杂度分析
1. 预处理内容
- :用数组存储从到的取值,递推时间。
- :预处理(到),用于时的计算,时间。
- 欧拉函数:对从到,用筛法预处理,时间。
- 的约数:枚举到,找出所有约数,时间。
2. 总复杂度
,可处理的范围。
四、样例验证
样例1:输入
- 预处理:。
- :,,。
- :
- 的约数:。
- :,,贡献。
- :,,贡献。
- ,,,。
样例2:输入
- :,,。
- :
- 的约数:。
- :,,贡献。
- :,,贡献。
- :,,贡献。
- :,,贡献。
- ,,,。
五、总结
- 通过“线性递推→环形修正”计算,核心是的推导。
- 基于Burnside引理,将旋转操作按约数分组,利用简化不动点计算。
- 预处理欧拉函数、递推数组和幂次是高效求解的关键。
- 1
信息
- ID
- 4018
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者