从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

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

  • \(a \equiv b (\bmod p)\)

\(proof\)

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

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

例题

\(solution\)

  • 对于每个连续段,考虑将每个质因子分开来考虑,在这里我们将有这个质因子的数定义为非空的数,并将其对该质因子取模后的只叫做特征值,将没有该质因子的数定义为空的数
  • 我们可以做一遍双指针,从前往后扫到第一个非空且特征值不同的数,然后更新其所能拓展的最远的位置,对于空的数,其所能拓展最远的数即离他最近的非空的数所能拓展的最远的位置,这里复杂度是线性的
  • 对于多个质因子,我们取\(min\)即可
  • 复杂度是优秀的\(O(\sum k * \pi(40))\)
posted @ 2021-05-08 22:51  y_dove  阅读(130)  评论(0编辑  收藏  举报