博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lucas&&Exlucas
阅读量:4677 次
发布时间:2019-06-09

本文共 1098 字,大约阅读时间需要 3 分钟。

Lucas和Exlucas可以求模p意义下大数的组合数。

先考虑p为质数的情况,那么直接上Lucas定理即可。

Lucas 定理基本内容

\[ C_n^m=C_{n\ mod\ p}^{m\ mod\ p}*C_{n/p}^{m/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!

转载于:https://www.cnblogs.com/Bhllx/p/10659267.html

你可能感兴趣的文章
菜鸟的MySQL学习笔记(三)
查看>>
商业选址5A法则
查看>>
POJ 1191 棋盘分割(区间DP)题解
查看>>
文件同步服务器,iis 集群 ,代码同步(一)
查看>>
JS之模板技术(aui / artTemplate)
查看>>
【Tomcat】Tomcat Connector的三种运行模式【bio、nio、apr】
查看>>
Mysql-2-数据库基础
查看>>
python把源代码打包成.exe文件
查看>>
PhotoshopCS5中将单位修改成百分比
查看>>
赵雅智:js知识点汇总
查看>>
cocos2d-x 3.0rc1 编译cpp-testsproject
查看>>
《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合...
查看>>
三种常见的图像处理双三次插值算法
查看>>
开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)...
查看>>
安卓启动相关以及架构设计相关
查看>>
第十四届华中科技大学程序设计竞赛--J Various Tree
查看>>
python面试题No2
查看>>
插入排序
查看>>
.Net Core + NGINX跳转登录时端口丢失
查看>>
C#实现对文件目录的实时监控
查看>>