• 洛谷 P5345 题解


    题解

    对于每个肥宅 \(i\) 考虑,第 \(m\) 天的体重显然应该是 \(k_i^m\bmod g_i\),对于目标体重 \(r_i\),会得到如下式子:

    \[k_i^m\equiv r_i\pmod{g_i} \]

    换个显然的形式:

    \[a^m\equiv b\pmod{p} \]

    注意到这里 \(p\) 不是质数,显然是一个 exBSGS 可以求解的问题。

    然而只有一个特解 \(u\) 并不能解决「有多个肥宅,求至少需要经过的天数」这样的问题,我们需要找出它的通解。

    假设现在用 exBSGS 求出了一个特解 \(u\),设再过 \(d\) 天又能符合条件。

    显然这个 \(d\) 就是满足 \(a^{u+d}\equiv a^u\pmod{p}\) 的最小正整数解。

    看起来是要求 \(a^d\equiv1\pmod{p}\) 的最小正整数解。

    这里已经非常显然了,根据有关的知识,其实就是求 \(\delta_p(a)\)

    求阶的方式也很简单:

    • \(\gcd(a,p)>1\) 时无解,此时原同余方程只有一个特解 \(u\)
    • 否则有 \(a^{\varphi(p)}\equiv1\pmod{p}\),必有 \(\delta_p(a)\mid\varphi(p)\),对 \(\varphi(p)\) 不断试除质因子即可得到 \(\delta_p(a)\)。原同余方程的通解为 \(x\equiv u\pmod{\delta_p(a)}\)

    当你迫不及待地求出阶后,便开心地发现自己在样例 #4(\(a=14,b=44,p=60\))WA 了。

    实际上要求的并不是 \(\delta_p(a)\)

    看下原目标:\(a^{u+d}\equiv a^u\pmod{p}\),即 \(a^db\equiv b\pmod{p}\)

    此处并没有说 \(b\perp p\)\(b^{-1}\) 可能并不存在,所以不能直接消掉 \(b\)

    也挺好解决的,记 \(t=\gcd(p,b),p'=\frac{p}{t}\),有\(a^d\times\frac{b}{t}\equiv\frac{b}{t}\pmod{p'}\),此时 \(\frac{b}{t}\perp p'\),可以直接消掉。

    所以要求的应该是 \(\delta_{p'}(a)\)

    现在变成了求阶线性同余方程组了(\(g_i'=\frac{g_i}{\gcd(g_i,r_i)}\),应该挺显然的):

    \[\begin{cases} x&\equiv& u_1\pmod{\delta_{g_1'}(k_1)}\\ x&\equiv& u_2\pmod{\delta_{g_2'}(k_2)}\\ &\vdots&\\ x&\equiv& u_n\pmod{\delta_{g_n'}(k_n)} \end{cases} \]

    此处显然也不保证模数互质,需要使用 exCRT。

    当你迫不及待地求出答案后,发现自己又听取 WA 声一片:

    image.png

    正确操作:当发现要做 CRT 之后,第一时间观察 \(g_i\)\(\operatorname{lcm}\) 性质。发现,没有性质。来人,上高精

    合并 \(\operatorname{lcm}\) 是做不了了,考虑什么情况下可以不合并。

    如果求出了某个答案 \(x\),发现它能符合所有的同余方程,这时候显然没有必要去取 \(\operatorname{lcm}\) 了。

    假设前 \(k\) 个同余方程解出的答案是 \(x\equiv ans\pmod{M}\)\(M>10^9\)),我们考虑直接尝试 \(A\) 能否符合第 \(k+1\) 个方程。如果不行的话,显然要合并。

    看下如果要合并,exCRT 老师会发生甚么事(代码来自 exCRT 模板题解):

    image.png

    ans += x*M!答案直接加上若干个 \(M\),显然是超过 \(10^9\) 范围了,此时可以直接返回无解。

    当然,和屠龙勇士类似,本题的最终答案一定要大于 \(\max\{u_i\}\),最后需要加一下。

  • 相关阅读:
    MySQL的注入过程
    nmap 扫描器的功能
    用dvwa演示带有用户令牌(user_token)的暴力破解
    在python中安装requests模块
    如何发现struts2漏洞
    vs2017的主题颜色的配置
    在vs上开发linux c++
    linux主机之间的SSH链接
    verilog 实用的小技巧
    verilog 实现DDS
  • 原文地址:https://www.cnblogs.com/lingfunny/p/16361132.html
Copyright © 2020-2023  润新知