1 条题解

  • 0
    @ 2025-10-17 15:43:23

    题意

    nn 条巨龙,按顺序杀。
    每条龙 ii 有:

    • 生命值 aia_i
    • 恢复力 pip_i
    • 杀死后获得一把新剑(攻击力 wiw_i

    玩家初始有 mm 把剑(攻击力已知)。
    打每条龙时:

    1. 选剑规则:选攻击力 ai\le a_i 的最大攻击力剑,若没有则选最小攻击力剑。
    2. 用该剑攻击 xx 次(固定的 xx),每次伤害 = 剑的攻击力。
    3. 攻击后龙的生命变化:aiaix×ATKa_i \to a_i - x \times \text{ATK},若此时 0\le 0,则恢复,每次恢复 pip_i,直到生命值 0\ge 0
    4. 必须最终生命值 恰好为 0 才死。

    求能通关所有龙的 最小正整数 xx,不存在输出 1-1


    问题分析

    1. 选剑的确定

    由于剑的选择规则固定,且每次杀龙后剑会变化(消失一把,获得一把),我们可以预先模拟整个过程的选剑结果。

    ATKi\text{ATK}_i 表示打第 ii 条龙时使用的剑的攻击力。

    模拟方法

    • 用平衡树(如 std::multiset)维护当前拥有的剑。
    • 对于龙 ii
      • 在平衡树中找 ai\le a_i 的最大元素(可用 upper_bound(a_i) 前一个元素),如果不存在则取最小元素(begin())。
      • 使用该剑,从平衡树中删除它。
      • 加入杀死该龙获得的剑 wiw_i

    这样我们得到序列 {ATKi}\{\text{ATK}_i\}


    2. 转化为同余方程

    对于第 ii 条龙,攻击 xx 次后,造成的伤害是 xATKix \cdot \text{ATK}_i

    攻击后生命值:

    剩余=aixATKi\text{剩余} = a_i - x \cdot \text{ATK}_i

    龙恢复 kik_i 次(ki0k_i \ge 0)后生命值恰好为 00,即:

    aixATKi+kipi=0a_i - x \cdot \text{ATK}_i + k_i \cdot p_i = 0

    整理得:

    xATKiai(modpi)x \cdot \text{ATK}_i \equiv a_i \pmod{p_i}

    并且需要满足:

    $$x \cdot \text{ATK}_i \ge a_i \quad\text{(因为恢复前生命值要 ≤ 0)} $$

    3. 同余方程标准化

    方程:

    ATKixai(modpi)\text{ATK}_i \cdot x \equiv a_i \pmod{p_i}

    di=gcd(ATKi,pi)d_i = \gcd(\text{ATK}_i, p_i)

    diaid_i \nmid a_i,则无解,直接输出 1-1

    否则令:

    $$A_i = \frac{\text{ATK}_i}{d_i}, \quad B_i = \frac{a_i}{d_i}, \quad P_i = \frac{p_i}{d_i} $$

    方程化为:

    AixBi(modPi)A_i \cdot x \equiv B_i \pmod{P_i}

    由于 gcd(Ai,Pi)=1\gcd(A_i, P_i) = 1,可求 AiA_i 在模 PiP_i 下的逆元 Ai1A_i^{-1},得到:

    xBiAi1(modPi)x \equiv B_i \cdot A_i^{-1} \pmod{P_i}

    设:

    xri(modPi)x \equiv r_i \pmod{P_i}

    其中 ri=(BiAi1)modPir_i = (B_i \cdot A_i^{-1}) \bmod P_i


    4. 合并同余方程

    现在我们得到若干方程:

    xr1(modP1)x \equiv r_1 \pmod{P_1} xr2(modP2)x \equiv r_2 \pmod{P_2}

    ...

    xrn(modPn)x \equiv r_n \pmod{P_n}

    扩展中国剩余定理 (ExCRT) 合并这些方程。

    ExCRT 合并两个方程:

    xr1(modm1)x \equiv r_1 \pmod{m_1} xr2(modm2)x \equiv r_2 \pmod{m_2}

    x=r1+tm1x = r_1 + t \cdot m_1,代入第二式:

    r1+tm1r2(modm2)r_1 + t \cdot m_1 \equiv r_2 \pmod{m_2} m1tr2r1(modm2)m_1 \cdot t \equiv r_2 - r_1 \pmod{m_2}

    d=gcd(m1,m2)d = \gcd(m_1, m_2),若 d(r2r1)d \nmid (r_2 - r_1) 则无解。
    否则化为:

    $$\frac{m_1}{d} \cdot t \equiv \frac{r_2 - r_1}{d} \pmod{\frac{m_2}{d}} $$

    解出 tt0(modm2d)t \equiv t_0 \pmod{\frac{m_2}{d}},即 t=t0+km2dt = t_0 + k \cdot \frac{m_2}{d}

    代回得:

    $$x = r_1 + m_1 \cdot \left(t_0 + k \cdot \frac{m_2}{d}\right) = (r_1 + m_1 \cdot t_0) + k \cdot \frac{m_1 m_2}{d} $$

    所以新方程:

    $$x \equiv r_1 + m_1 \cdot t_0 \pmod{\mathrm{lcm}(m_1, m_2)} $$

    重复合并直到所有方程合并成一个 xR(modM)x \equiv R \pmod{M}


    5. 处理攻击力下限条件

    我们还有条件:

    xATKiaix \cdot \text{ATK}_i \ge a_i

    即:

    xaiATKix \ge \lceil \frac{a_i}{\text{ATK}_i} \rceil

    设:

    $$L = \max_{i=1}^n \left\lceil \frac{a_i}{\text{ATK}_i} \right\rceil $$

    最终 xx 必须 L\ge L 且满足同余方程 xR(modM)x \equiv R \pmod{M}


    6. 求解最小正整数解

    设最终合并为:

    xR(modM)x \equiv R \pmod{M}

    最小非负解是 x0=RmodMx_0 = R \bmod M(调整为 [0,M)[0, M) 范围内)。

    如果 x0Lx_0 \ge L,则答案为 x0x_0
    否则,需要找到最小的 xLx \ge LxR(modM)x \equiv R \pmod{M}

    x=x0+kMLx = x_0 + k \cdot M \ge L kLx0Mk \ge \frac{L - x_0}{M}

    k=(Lx0)/Mk = \lceil (L - x_0) / M \rceil(如果 L>x0L > x_0),则:

    x=x0+kMx = x_0 + k \cdot M

    算法步骤

    1. 读入数据。
    2. multiset 模拟选剑过程,得到 ATKi\text{ATK}_i
    3. 对每条龙:
      • 检查 gcd(ATKi,pi)ai\gcd(\text{ATK}_i, p_i) \mid a_i,否则输出 1-1
      • 标准化方程,得到 xri(modPi)x \equiv r_i \pmod{P_i}
    4. 用 ExCRT 合并所有同余方程,得到 xR(modM)x \equiv R \pmod{M}
    5. 计算 L=maxai/ATKiL = \max \lceil a_i / \text{ATK}_i \rceil
    6. 找最小 xLx \ge L 满足同余式。
    7. 输出结果。

    时间复杂度

    • 模拟选剑:O((n+m)logm)O((n + m) \log m)
    • ExCRT:O(nlog(maxpi))O(n \log (\max p_i))
    • 总体可行。

    样例验证

    以第一组数据为例:

    输入

    3 3
    3 5 7
    4 6 10
    7 3 9
    1 9 1000
    

    模拟选剑:

    • 龙1: a=3a=3,剑 {1,9,1000},选1,得新剑7 → {7,9,1000}
    • 龙2: a=5a=5,选7,得新剑3 → {3,9,1000}
    • 龙3: a=7a=7,选3,得新剑9 → {9,9,1000}

    所以 ATK = [1, 7, 3]。

    解方程:

    • 龙1: 1x3(mod4)1 \cdot x \equiv 3 \pmod{4}x3(mod4)x \equiv 3 \pmod{4}
    • 龙2: 7x5(mod6)7 \cdot x \equiv 5 \pmod{6}x5(mod6)x \equiv 5 \pmod{6}
    • 龙3: 3x7(mod10)3 \cdot x \equiv 7 \pmod{10}x9(mod10)x \equiv 9 \pmod{10}

    合并:

    1. x3(mod4)x \equiv 3 \pmod{4}x5(mod6)x \equiv 5 \pmod{6}
      tt: 4t2(mod6)4t \equiv 2 \pmod{6}2t1(mod3)2t \equiv 1 \pmod{3}t2(mod3)t \equiv 2 \pmod{3}
      x=3+42=11(mod12)x = 3 + 4 \cdot 2 = 11 \pmod{12}x11(mod12)x \equiv 11 \pmod{12}

    2. x11(mod12)x \equiv 11 \pmod{12}x9(mod10)x \equiv 9 \pmod{10}
      tt: 12t2(mod10)12t \equiv -2 \pmod{10}2t8(mod10)2t \equiv 8 \pmod{10}t4(mod5)t \equiv 4 \pmod{5}
      x=11+124=59(mod60)x = 11 + 12 \cdot 4 = 59 \pmod{60}x59(mod60)x \equiv 59 \pmod{60}

    $L = \max(\lceil 3/1 \rceil, \lceil 5/7 \rceil, \lceil 7/3 \rceil) = \max(3, 1, 3) = 3$
    59359 \ge 3,所以答案是 5959,符合样例。


    代码实现注意事项

    • 使用 multiset 维护剑的集合。
    • 注意选剑规则:upper_bound 前一个元素。
    • 大数运算使用 long long,乘法可能溢出,要用快速乘或 __int128
    • 检查无解情况:① 同余方程无解 ② 逆元不存在(但这里标准化后互质,一定有逆元)③ 恢复前生命值不能 >0 的情况已在 LL 中处理。
    • 1

    信息

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