只是补一些其他人早就会的东西。
$$Chinese remainder theorem$$
用于解
$xequiv amod M$
满足
$xequiv a_1mod m_1$
$xequiv a_2mod m_2$
$xequiv a_3mod m_3$
$forall i,j,gcd(m_i,m_j)==1 && prod m_i=M$
因为互质可以知道一定有解
考虑构造一个可行解出来,例如对每个方程,给$x$加上一个数$y$
满足$y=k*frac{M}{m_i}&&yequiv a_imod m_i$
自然地想到$y=a_i*frac{M}{m_i}*inv(frac{M}{m_i},m_i)$
$$Ex Chinese remainder theorem$$
用于解
$xequiv amod M$
满足
$xequiv a_1mod m_1$
$xequiv a_2mod m_2$
$xequiv a_3mod m_3$
$exists i,j,gcd(m_i,m_j)>1 && lcm(m_i)=M$
$m_i$不保证互质,不一定有解,而且只能知道$mod lcm(m_i)$的准确值
考虑构造一个解出来,希望套用前面的做法但是此时不互质了可能不存在逆元
所以直接乘上$prod m_i$除以$m_i$的做法不再可行,因为没有逆元可乘不能保证不影响结果在其他方程的余数
只能~~去颓别人的结论~~继续考虑一个一个方程地构造,假设目前得到了满足前$k-1$个方程的结果
网络上有写的很好的解同余方程组的解法,不(找)复(不)读(见)了,记一下自己的理解。
而我要保证前k-1个方程的结果不动,现在唯一能做的就是给$a_{k-1}$加上一堆$lcm_{i=1}^{k-1}(m_i)$的倍数来调整其$mod m_k$的结果
就像当初疯狂向$x$累加$frac{M}{m_i}$的倍数一样...
具体是多少倍,这应该参考每加一个$m'=lcm_{i=1}^{k-1}(m_i)$会造成什么影响
就是使结果增加$gcd(m',m_k)$吧。
那么需要加的东西就是$frac{a_k-lastans}{gcd(m',m_k)}*m'$
注意这里若$(a_k-lastans)%gcd(m',m_k)>0$,则无解。
$$Lucas Theorem$$
求$C_n^mmod p,pin prime$,$n,m$很大
lucas发现了一个结论:
$forall iin[1,n-1],C_n^i\%n==0$等价于$nin prime$
$nin prime$时,左式显然成立
$n$是合数时,将$n$的质因子$p$代入
$C_n^p=frac{n}{p}frac{(n-1)!}{(n-p!(p-1)!}$
这个东西显然已经没有$p$这一因子了,不能被n整除。
这个有什么用?
不是要求组合数吗,组合数就是二项式系数,那就拆个二项式。
$egin{aligned}\(x+1)^p(mod p)&=sumlimits_{i=0}^n C_n^i x^i(mod p)\&=1+x^p(mod p)\end{aligned}$
想让等式左边变成$(x+1)^n$,于是把n写成p进制
$egin{aligned}\(x+1)^n&=prod ((x+1)^{p^k})^{c_k}\&=prod (1+x^{p^k})^{c_k}\end{aligned}$
把m也写成p进制,那么得到了
$C_n^m=prod C_{c_k}^{b_k}$
即是。
$$Ex Lucas Theorem$$
和$Lucas Theorem$没啥关系了。
对于乱七八糟的合数$M$,拆成$prod p^k$,这样可以用crt合并。
求$mod p^k$的值,我们要保证把p的倍数和其他数分开,因为一旦乘到了0就不可逆了
所以要把分子分母的阶乘分开考虑,才能实现p的次数互消
一个简单的想法是只考虑阶乘中p的次数以及其余乘积$mod p^k$的值
$p$的次数容易求出,在$sum p^k$的复杂度可以接受的情况下,后者也容易求出
因为$prodlimits_{i=1}^{p^k} [i%p!=0] i$和$prodlimits_{i=p^k+1}^{2p^k} [i%p!=0] i$在$mod p^k$是相等的
所以这种整段的直接快速幂,零碎的预处理,
至于$prod [i%p==0] i$这一部分,把p这一因子提出来发现也成为了阶乘的形式,递归即可。