扩展Lucas定理及其优化
-
求:\(\binom{n}{m} ~mod~p^k\)
-
\(n,m\le 10^{18}\),\(p^k\le 10^7\)。
我们可以求出这样一个形式,即\(n!=p^{x}*y(gcd(y,p)=1)\),然后:
\(\binom{n}{m}={n! \over m!*(n-m)!}\)
这样\(p\)的幂次用上面-下面算,然后\(y\)是有逆元的,逆元的话可以用欧拉定理,如果写的是excrt,也可以直接用,这样就做完了。
现在算\(n!\):
\(n!=(\prod_{i=1且i~mod~p>0}^{p^k}i)^{n/{p^k}}*(\prod_{i=1且i~mod~p>0}^{n~mod~p^k}i)*(n/p)!*p^{n/p}\)
\((n/p)!\)可能产生新的\(p\)的倍数,这个可以递归解决。
要预处理\(p^k\)的与\(p\)互质数的前缀积,每一层还有个快速幂,复杂度:\(O(log_p^n *log_2^n+p^k)\)
洛谷模板题:
https://www.luogu.org/problemnew/show/P4720
优化:
高斯泛化的威尔逊定理
也就是\(p^k\)时的威尔逊定理。
也就是说:
\(\prod_{i=1且i~mod~p>0}^{p^k}~~i\)只能是\(1\)或者\(-1\),那么可以省去快速幂的复杂度。
复杂度就变成了\(O(log_p^n+p^k)\)
转载注意标注出处:
转自Cold_Chair的博客+原博客地址