zoukankan      html  css  js  c++  java
  • 从CF722F浅谈一类线性同余方程问题

    引入

    (OI)中,我们常常会遇到一类线性同余方程问题,一般地,我们可以用(crt)或者(excrt)来解决

    但如果我们只要求有没有解呢,自然也可以用(excrt)来解,但是这样记录的信息太多,影响效率和进一步拓展,下文将从质数的一些性质出发,探索更高效的方法

    一些约定

    • (<p,q>)表示(p,q)互质
    • (x/y)表示(x)除以(y)下取整

    引理1

    • 如果(x equiv a(mod p * q))(<p,q>)
    • 那么,该条件的等价描述为(x equiv (a mod p)(mod p)),(x equiv (a mod q)(mod q)),记为向量((p,q))
    • 证明:充分性是显然的,必要性的话可以考虑(excrt)即可证明
    • 根据这个引理,我们可以把每个模数(P)拆成(m)维向量((p_1^{k_1},p_2^{k_2},.....,p_m^{k_m})),于是我们接下来仅需对每个质因子分别考虑即可

    引理2

    方程组(egin{cases} x equiv a (mod p^k)\ x equiv b (mod p^j)\ end{cases})
    若有解,等价于(\)

    • (a equiv b (mod p))

    (proof)

    • (x equiv a(mod p^k) ightarrow x = (t * p*(p^{k-1} + a / p) + a mod p) ightarrow x equiv a mod p(mod p))
    • 考虑若有解,形式必定为(x equiv A(mod p^K)),那么(x equiv (A mod p)(mod p)),即(x)(p)取模的余数唯一,证毕

    有了以上两个引理,我们判断两个方程是否有解时,仅需分解质因数,然后对每个质因数判断是否矛盾即可,在计算两个的时候看起来更加复杂了,但如果是批量计算多个的时候,这个方法也许就能显示出他的强大之处

    例题

    (solution)

    • 对于每个连续段,考虑将每个质因子分开来考虑,在这里我们将有这个质因子的数定义为非空的数,并将其对该质因子取模后的只叫做特征值,将没有该质因子的数定义为空的数
    • 我们可以做一遍双指针,从前往后扫到第一个非空且特征值不同的数,然后更新其所能拓展的最远的位置,对于空的数,其所能拓展最远的数即离他最近的非空的数所能拓展的最远的位置,这里复杂度是线性的
    • 对于多个质因子,我们取(min)即可
    • 复杂度是优秀的(O(sum k * pi(40)))
  • 相关阅读:
    oracle中查看sql语句的执行计划
    linux跨主机复制文件
    linux主机登录另一台linux主机
    JVM内存监控:visualVM jconsole jstatd jmap
    linux shell自动输入实现
    awk 截取字符串
    dos2unix dos文本转换为linux文本 /bin/bas^M:bad interpreter
    EasyUI
    Jquery插件 easyUI属性汇总
    移动端省际联动插件mobiscroll
  • 原文地址:https://www.cnblogs.com/y-dove/p/14746832.html
Copyright © 2011-2022 走看看