1 条题解

  • 0
    @ 2026-8-24 3:47:57

    【模板】扩展中国剩余定理(EXCRT)题解

    思路

    设已经合并的若干条同余式等价于

    xr(modM).x\equiv r\pmod M.

    现在加入 xb(moda)x\equiv b\pmod a。令 x=r+Mkx=r+Mk,就需要解

    Mkbr(moda).Mk\equiv b-r\pmod a.

    g=gcd(M,a)g=\gcd(M,a)。题目保证原方程组有解,因此 g(br)g\mid(b-r)。两边同时除以 gg 后得到

    Mgkbrg(modag).\frac M g k\equiv\frac{b-r}g\pmod{\frac a g}.

    M/gM/ga/ga/g 互质,可以用扩展欧几里得算法求出 M/gM/g 在模 a/ga/g 意义下的逆元,从而求得最小非负的 kk。新的模数为

    lcm(M,a)=Mag,\operatorname{lcm}(M,a)=M\frac a g,

    再把 r+Mkr+Mk 归一化到这个模数下即可。

    第一档中模数依次整除。由于数据保证有解,最后一条同余式已经蕴含前面的所有同余式,所以直接输出 bnmodanb_n\bmod a_n

    第二档中模数两两互质,可以使用普通中国剩余定理:对模数乘积 PP,令 Pi=P/aiP_i=P/a_i,求 PiP_iaia_i 的逆元,将 biPiPi1b_iP_iP_i^{-1} 求和后对 PP 取模。

    做法

    初始令 M=1,r=0M=1,r=0。按输入顺序逐条合并同余式:

    1. 用扩展欧几里得算法求 g=gcd(M,ai)g=\gcd(M,a_i) 以及相应系数。
    2. 在线性同余式中求出 kkai/ga_i/g 的最小非负剩余。
    3. 更新 rr+Mkr\leftarrow r+Mk,并对新模数 M(ai/g)M(a_i/g) 归一化。
    4. 更新 MM(ai/g)M\leftarrow M(a_i/g)

    所有同余式处理完成后输出 rr。乘法使用 128 位整数完成,避免中间结果溢出。

    正确性可以用归纳法证明。初始状态表示所有整数。假设当前的 r,Mr,M 恰好描述已经处理的同余式的全部解,线性同余式求出的 kk 恰好使 r+Mkr+Mk 同时满足新同余式;而 kk 在模 ai/ga_i/g 意义下唯一,所以合并后的解恰好构成模 lcm(M,ai)\operatorname{lcm}(M,a_i) 的一个剩余类。归纳可知最终 rr 满足全部同余式,归一化后就是最小非负解。

    复杂度

    每次合并只进行一次扩展欧几里得运算,时间复杂度为 O(nlogA)O(n\log A),其中 A=maxaiA=\max a_i;额外空间复杂度为 O(1)O(1)

    • 1

    【模板】扩展中国剩余定理(EXCRT)

    信息

    ID
    1017
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者