Lucas定理(大组合数的取模)
2015-09-15 16:53
204 查看
首先给出这个Lucas定理:
A、B是非负整数,p是质数。AB写成p进制:A=a
a[n-1]...a[0],B=b
b[n-1]...b[0]。
则组合数C(A,B)与C(a
,b
)*C(a[n-1],b[n-1])*...*C(a[0],b[0]) mod p同余
即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)
这个定理的证明不是很简单,我一直想找个很好的证明,但是,没找到,昨天看到了一个解题报告,基本上可以说明白这个Lucas定理是怎么回事了,具体的是说:
以求解n! % p为例,把n分段,每p个一段,每一段求的结果是一样的。但是需要单独处理每一段的末尾p, 2p, ...,把p提取出来,会发现剩下的数正好又是(n / p)!,相当于划归成了一个子问题,这样递归求解即可。
这个是单独处理n!的情况,当然C(n,m)就是n!/(m!*(n-m)!),每一个阶乘都用上面的方法处理的话,就是Lucas定理了,注意这儿的p是素数是有必要的。
Lucas最大的数据处理能力是p在10^5左右,不能再大了,hdu 3037就是10^5级别的!
对于大组合数取模,n,m不大于10^5的话,用逆元的方法,可以解决。对于n,m大于10^5的话,那么要求p<10^5,这样就是Lucas定理了,将n,m转化到10^5以内解。
然后再大的数据,我就不会了!
推荐题:hdu 3037
A、B是非负整数,p是质数。AB写成p进制:A=a
a[n-1]...a[0],B=b
b[n-1]...b[0]。
则组合数C(A,B)与C(a
,b
)*C(a[n-1],b[n-1])*...*C(a[0],b[0]) mod p同余
即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)
这个定理的证明不是很简单,我一直想找个很好的证明,但是,没找到,昨天看到了一个解题报告,基本上可以说明白这个Lucas定理是怎么回事了,具体的是说:
以求解n! % p为例,把n分段,每p个一段,每一段求的结果是一样的。但是需要单独处理每一段的末尾p, 2p, ...,把p提取出来,会发现剩下的数正好又是(n / p)!,相当于划归成了一个子问题,这样递归求解即可。
这个是单独处理n!的情况,当然C(n,m)就是n!/(m!*(n-m)!),每一个阶乘都用上面的方法处理的话,就是Lucas定理了,注意这儿的p是素数是有必要的。
Lucas最大的数据处理能力是p在10^5左右,不能再大了,hdu 3037就是10^5级别的!
对于大组合数取模,n,m不大于10^5的话,用逆元的方法,可以解决。对于n,m大于10^5的话,那么要求p<10^5,这样就是Lucas定理了,将n,m转化到10^5以内解。
然后再大的数据,我就不会了!
推荐题:hdu 3037
相关文章推荐
- HDu 5433 Xiao Ming climbing (BFS)
- [gradle] is applicable for argument types
- 度小于所述过程:es.exe
- Android - 视图点击效果
- 【Java笔记】——多线程同步机制模拟生产者/消费者模型
- 出学C++之while (std::cin >> value)问题
- (转)数据库采用B+树而不是B-树 b树的原因
- 网络流转换为Byte数组
- apache commons io包基本功能
- Morris ajax
- mybatis 存储过程
- Spring学习(一)
- Android使用ValueAnimator实现双击事件的判断
- NHibernate从入门到精通系列(8)——一对一关联映射
- iOS 图片处理(截图,图片叠加(添加水印))
- 为什么要使用SLF4J而不是Log4J
- TCP/IP协议与OSI协议
- RTP协议分析
- Nginx配置文件详细说明
- Java RMI原理与使用