1 条题解

  • 0
    @ 2025-10-24 19:41:10

    题解:中二病DNA疫苗问题

    问题核心

    给定环形DNA的nn段和距离阈值kk,需解决两个问题:

    1. 不考虑旋转,求满足“任意两段距离≥kk”的非空子集数(记为ans1ans1)。
    2. 考虑旋转等价(旋转后相同的子集算一种),求本质不同的非空子集数(记为ans2ans2)。

    距离定义:两段中间隔的最少段数+1+1,如第nn段与第11段距离为11;答案需对109+710^9+7(记为MODMOD)取模。

    一、求解ans1ans1:不考虑旋转的非空子集数

    关键思路:线性→环形转化

    环形的约束比线性更紧(需额外保证第11段与第nn段的距离≥kk),因此先计算线性情况的独立集数目,再修正为环形。

    1. 线性情况的独立集数目(含空集)

    定义f(x)f(x)为“线性排列的xx段DNA,满足任意两段距离≥kk的子集数(含空集)”,递推关系如下:

    • 递推公式f(x)=(f(x1)+f(xk))modMODf(x) = (f(x-1) + f(x-k)) \mod MOD
      解释:对第xx段,有两种选择——不选(则前x1x-1段的子集数为f(x1)f(x-1));选(则前xkx-k段不能选,子集数为f(xk)f(x-k))。
    • 边界条件f(x)=1f(x) = 1(若x<0x < 0,视为空集的特殊情况);f(0)=1f(0) = 1(空集本身)。

    2. 环形情况的独立集数目(含空集)

    定义g(n)g(n)为“环形排列的nn段DNA,满足条件的子集数(含空集)”。环形需排除“线性中合法但第11段与第nn段距离<kk”的子集:

    • 11段与第nn段的距离恒为11,因此仅当k>1k>1时,需排除“同时包含第11段和第nn段”的线性子集。
    • 这类子集的数目为f(n2k)f(n-2k)(中间n2kn-2k段的独立集数,含空集;若n2k<0n-2k < 0,取f(n2k)=1f(n-2k)=1)。

    因此:

    • k=1k=1:所有子集均满足条件,g(n)=f(n)=2ng(n) = f(n) = 2^n(因k=1k=1f(x)f(x)递推为2x2^x)。
    • k>1k>1g(n)=(f(n)f(n2k))modMODg(n) = (f(n) - f(n-2k)) \mod MOD(需保证结果非负,可加MODMOD后再取模)。

    3. 计算ans1ans1

    g(n)g(n)含空集,因此非空子集数为:

    ans1=(g(n)1)modMODans1 = (g(n) - 1) \mod MOD

    二、求解ans2ans2:本质不同的非空子集数

    关键工具:Burnside引理

    旋转等价类数目 = 所有旋转操作的不动点子集数的平均值。旋转群含nn个操作(旋转0,1,...,n10,1,...,n-1个位置),步骤如下:

    1. 不动点子集数C(t)C(t)(旋转tt个位置)

    对旋转tt,记d=gcd(t,n)d = \gcd(t, n)(循环个数),L=n/dL = n/d(每个循环的长度)。不动子集需满足“选整个循环或不选”,且循环内/间满足距离约束:

    • d<kd < k:循环内段的距离为d<kd < k,选循环会违反条件,因此仅空集合法,C(t)=1C(t) = 1
    • dkd ≥ k:循环内段的距离≥dkd ≥ k,合法。此时选择循环的问题等价于“长度为dd的环形DNA的独立集数(含空集)”,即g(d)g(d)(同g(n)g(n)的定义,仅将nn替换为dd),因此C(t)=g(d)C(t) = g(d)

    2. 按约数分组计算总和

    dd必为nn的约数,对每个约数dd,统计满足gcd(t,n)=d\gcd(t, n)=dtt的个数(即ϕ(n/d)\phi(n/d),欧拉函数),则所有旋转的不动点子集数总和为:

    $$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. 计算ans2ans2

    • 所有子集(含空集)的本质不同数目:S=(sumC×inv(n))modMODS = (sum_C \times inv(n)) \mod MOD,其中inv(n)inv(n)nnMODMOD下的逆元(因MODMOD是质数,inv(n)=pow(n,MOD2,MOD)inv(n) = \text{pow}(n, MOD-2, MOD))。
    • 减去空集的等价类(1个),得:
    ans2=(S1)modMODans2 = (S - 1) \mod MOD

    三、预处理与复杂度分析

    1. 预处理内容

    • f(x)f(x):用数组存储xx00nn的取值,递推时间O(n)O(n)
    • pow2(x)pow2(x):预处理2xmodMOD2^x \mod MODxxnn),用于k=1k=1时的g(d)g(d)计算,时间O(n)O(n)
    • 欧拉函数ϕ(m)\phi(m):对mm11nn,用筛法预处理,时间O(nloglogn)O(n \log \log n)
    • nn的约数:枚举11n\sqrt{n},找出所有约数,时间O(n)O(\sqrt{n})

    2. 总复杂度

    O(nloglogn+n)O(n \log \log n + \sqrt{n}),可处理n105n ≤ 10^5的范围。

    四、样例验证

    样例1:输入525 2

    1. 预处理f(x)f(x)f(0)=1,f(1)=2,f(2)=3,f(3)=5,f(4)=8,f(5)=13f(0)=1, f(1)=2, f(2)=3, f(3)=5, f(4)=8, f(5)=13
    2. ans1ans1k=2>1k=2>1g(5)=13f(1)=11g(5)=13 - f(1)=11ans1=111=10ans1=11-1=10
    3. ans2ans2
      • n=5n=5的约数:1,51,5
      • d=1d=1ϕ(5)=4\phi(5)=4d<2d<2,贡献4×1=44×1=4
      • d=5d=5ϕ(1)=1\phi(1)=1g(5)=11g(5)=11,贡献1×11=111×11=11
      • sumC=15sum_C=15inv(5)=200000001inv(5)=200000001S=15×200000001=3S=15×200000001=3ans2=31=2ans2=3-1=2

    样例2:输入616 1

    1. ans1ans1k=1k=1g(6)=26=64g(6)=2^6=64ans1=641=63ans1=64-1=63
    2. ans2ans2
      • n=6n=6的约数:1,2,3,61,2,3,6
      • d=1d=1ϕ(6)=2\phi(6)=2g(1)=21=2g(1)=2^1=2,贡献2×2=42×2=4
      • d=2d=2ϕ(3)=2\phi(3)=2g(2)=4g(2)=4,贡献2×4=82×4=8
      • d=3d=3ϕ(2)=1\phi(2)=1g(3)=8g(3)=8,贡献1×8=81×8=8
      • d=6d=6ϕ(1)=1\phi(1)=1g(6)=64g(6)=64,贡献1×64=641×64=64
      • sumC=84sum_C=84inv(6)=166666668inv(6)=166666668S=14S=14ans2=141=13ans2=14-1=13

    五、总结

    1. ans1ans1通过“线性递推→环形修正”计算,核心是g(n)g(n)的推导。
    2. ans2ans2基于Burnside引理,将旋转操作按约数分组,利用g(d)g(d)简化不动点计算。
    3. 预处理欧拉函数、递推数组和幂次是高效求解的关键。
    • 1

    信息

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