1 条题解

  • 0
    @ 2025-8-24 23:13:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar undefined_Ryan
    这个家伙很懒,什么也没有留下

    搬运于2025-08-24 23:13:55,当前版本为作者最后更新于2025-05-04 08:31:26,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    下记 p=998244353p=998244353

    首先考虑一个简化版本的问题:

    小 A 和小 B 玩若干轮游戏,每轮获胜者加 22 分,失败者加 11 分,已知 a,ba,b 是两人分数模 kk 的余数,求游戏最小轮数。

    即:有 22 个非负整数 A,BA,B,满足 max{A,B}min{A,B}2\frac{\max\{A,B\}}{\min\{A,B\}}\le23A+B3|A+B,已知它们模 kk 的余数 a,ba,b,求 A+B3\frac{A+B}3 的最小值。

    跑一下 BSGS 可以得到 kk(即 22pp 的阶)是 p12=499122176\frac{p-1}2=499122176,这个数并不是 33 的倍数,所以通过将 a,ba,b 增加同等数量的 kk 可以达到条件,而且所需的数量不大。直接贪心:每次取 a,ba,b 中较小的一个增加 kk,直到满足条件。这个子问题的时间复杂度是 O(1)O(1),可能相对某些数学做法更慢,但是足够通过本题。

    那么我们接下来就只需要解决以下这个问题:

    mm 次询问,每次询问一个正整数 nn,要求输出 2xn(modp)2^x\equiv n\pmod p 的最小非负整数解或判断无解(m2×105m\le2\times10^5)。

    这不就是一个 BSGS 裸题吗?等等:BSGS 是 O(p)O(\sqrt p) 的,这样总复杂度就是 10910^9 量级的,显然不能通过。

    我们仔细研究一下 BSGS 的实现(假设你已经学过了 BSGS),然后考虑优化。

    定义一个常数 k=pk=\lceil\sqrt p\rceil。然后先预处理 baBba^B 的所有取值(0B<k0\le B<k),用数据结构存储,再枚举 aAka^{Ak} 的值(1Ak1\le A\le k1Apk1\le A\le\lceil\frac pk\rceil),找到 aAkbaB(modp)a^{Ak}\equiv ba^B\pmod p,则有 aAkBb(modp)a^{Ak-B}\equiv b\pmod p。(参考 OI Wiki 上的实现)

    baBba^B 是对每组询问不同的,而 aa 是固定的,所以 aAka^{Ak} 是相同的。考虑颠倒如上操作顺序。因为答案的上限是 p12=499122176\frac{p-1}2=499122176,我们可以进行进一步优化。

    定义一个常数 kk。然后先预处理 aAka^{Ak} 的所有取值(1Ap2k1\le A\le\lceil\frac p{2k}\rceil),用数据结构存储,再枚举 baBba^B 的值(0B<k0\le B<k),找到 aAkbaB(modp)a^{Ak}\equiv ba^B\pmod p,则有 aAkBb(modp)a^{Ak-B}\equiv b\pmod p

    总时间复杂度为 O(p2k+mk)O(\frac p{2k}+mk)。取 k=p2m=50k=\lceil\sqrt\frac p{2m}\rceil=50,则时间复杂度为 O(pm)O(\sqrt{pm}),量级为 10710^7,可以通过本题。

    注:这里假设哈希表的单次操作复杂度为 O(1)O(1),因为一些显然的原因,需要手写哈希表。aAka^{Ak} 分布较为均匀且与输入数据无关(不会被卡),所以直接取模即可,单个链表内不会超过 1010 个数据。注意 BSGS 算法无法解决答案为 00 的情况,需要特判。

    提交记录

    • 1

    信息

    ID
    12095
    时间
    2000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者