Lucas&&Exlucas
Posted bhllx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucas&&Exlucas相关的知识,希望对你有一定的参考价值。
Lucas和Exlucas可以求模p意义下大数的组合数。
先考虑p为质数的情况,那么直接上Lucas定理即可。
Lucas 定理基本内容:
[
C_n^m=C_{n mod p}^{m mod p} (mod p) p是质数
]
对于Lucas的实现直接递归处理即可,注意特判n<m的情况。
如果p不为质数,那么用Exlucas求解。
实际上,Exlucas和Lucas定理没有关系……
由于p不为质数,所以可以考虑把p质因数分解:
[
p=p_1^{c_1}*p_2^{c_2}...p_t^{c_t}
]
那么可以问题可以转化成求解下列每一个式子的值,然后用CRT合并答案即可:
[ C_n^m mod p_1^{c_1}C_n^m mod p_2^{c_2}...C_n^m mod p_t^{c_t}\]
继续转化,把组合数写成阶乘形式,相当于要求:
[ frac{n!}{m!·(n-m)!} mod p^k ]
发现直接做不好做,逆元问题都不好解决,考虑把左边每一项中的因子p给提出来:
[ frac{frac{n!}{p^{a_1}}}{frac{m!}{p^{a_2}}*frac{(n-m)!}{p^{a3}}}*p^{a^1-a^2-a^3} mod p^k ]
这样逆元就可以直接用Exgcd球了。
那么现在重点解决的问题又变成了:
[ n! mod p^k 其中n还要除去所有的因子p ]
举个例子:n=22,p=3,k=2
把其中所有p(也就是3)的倍数提取出来,得到:
[ 22!=3^7×(1×2×3×4×5×6×7)×(1×2×4×5×7×8)×(10×11×13×14×16×17)×(19×20×22) ]
可以发现:
[ (1×2×4×5×7×8)equiv(10×11×13×14×16×17) (mod 3) ]
所以对于这种一段一段的可以直接处理,最后求一下它(n/p^k)次方即可。
对于3的次方不需要考虑,因为在外面会乘上来。
那么为什么不把3,6彻底分解呢?
这是为了递归的方便,可以发现存在一项7!,也就是(n/p)!,可以递归处理。
所以在一层层递归中,每次每个含有因数p的数提且仅提出一个p,那么可以实现递归,且最后可以把所有p都提出!
然后就可以开心的求出组合数了O(∩_∩)O!
以上是关于Lucas&&Exlucas的主要内容,如果未能解决你的问题,请参考以下文章