以下所有分数默认取整。
CRT
有 \(\begin{cases}x\equiv a_1\pmod {p_1}\\x\equiv a_2\pmod {p_2}\\\cdots\\x\equiv a_n\pmod {p_n}\end{cases}\),且所有 \(p\) 互质。
令 \(p'_i=\dfrac {\prod p}{p_i}\),且 \(p'_i\) 在 \(\bmod p_i\) 意义下逆元为 \(q_i\),则可构造解为 \(x=\sum\limits_{i=1}^na_ip'_iq_i\)。
注意这里没有保证 \(p\) 是质数,所以要用 exgcd 求逆元。
exCRT
\(p\) 不互质了,怎么办?
每次合并两个方程 \(x\equiv r_1\pmod p_1\) 和 \(x\equiv r_2\pmod p_2\),假设现有方程是前者,初始 \(r_1=0, p_1=1\)。
我们现在需要满足 \(p_1k_1+r_1\equiv r_2\pmod p_2\),即 \(p_1k_1+r_1= r_2+p_2k_2\),移项即为 \(p_1k_1-p_2k_2=r_2-r_1\),这个 exgcd 解出来,判一下无解,否则就可以直接还原,如果解出来 \(x\),方程的通解就是 \(x+k\operatorname{lcm}(p_1,p_2)\)。
Lucas
对于 \(p\in \mathbb P\),有
exLucas
\(p\) 不是质数,怎么办?
可以将 \(p\) 唯一分解,然后对于每个分离出来的质因子的幂解决,最后 CRT 合并,以下令这个因子幂为 \(p^k\)(上面的 \(p\) undef 了)。
现在变成了 \(\dbinom{n}{m}\equiv r\pmod{p^k}\),目标就是对每一个 \(p^k\) 求出 \(r\),把组合数拆开来:
左边式子不是很好求的,但是只要把 \(p\) 都提出来就好了,令数 \(n!\) 里面 \(p\) 因子的个数为 \(g(n)\),去除 \(p\) 因子的数为 \(f(n)\),则答案变为:
现在下面那个肯定是存在逆元了,只差快速算出 \(f,g\),先以 \(f\) 为例,下面式子都在 \(\bmod p^k\) 意义下进行。
上面 \(f\) 里面阶乘要带换成 \(f\left(\dfrac n p\right)\) 的原因是这个里面可能还有 \(p\) 的因子,不断去除。这个就可以递归算了,\(g\) 同理,求的就是 \(f\) 最前面 \(p\) 的幂次。
两个边界都是 \(f(0)=g(0)=0\)。