引入
在(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)))