从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))\)