关于【逆元】和【lucas定理】
来源:互联网 发布:python time 加减 编辑:程序博客网 时间:2024/06/05 00:24
原文链接:点击打开链接
这个Lucas定理是解决组合数的时候用的,当然是比较大的组合数了。比如C(1000000,50000)% mod,这个mod肯定是要取的,要不算出来真的是天文数字了。
对于一个组合数C(n,k),它等于 n! / ( k! * ( n - k)! ) 我们要求一个mod。但是我们知道的同余定理是在 + - * 这三个运算中使用的,对于除法我们不能轻易的使用同余定理。如果我们能把除数(分母)转化为一个乘法就好了,这个时候我们就用到了逆元的知识:
这就开始说逆元了:
定义:对于正整数和,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。
如果m是素数且GCD(a,mod)== 1,我们就直接可以用费马小定理求了。即求:a^(m-2)% mod。
用快速幂求即可。
如果还不明白逆元是个啥,我举个简单的例子来看看:
求:(24 / 3)% 5 我们可以直接观察得结果:3
但是这个只是个24,如果前面是一个很大很大的数的连乘longlong都存不下呢?我们肯定是一边乘一边求mod。在这里,我们把24对5求模,结果是4。这个4不能直接除以3再求模,一看肯定是错误的。这里我们要把这个4乘3的逆元再求模。根据刚刚说的,3的逆元为3^(5-2) = 27 (或者用扩展欧几里得exGCD(3,5,x,y)这样求出来的x就是3mod5的逆元)。然后按照刚刚说的,4 * 27 % 5 = 3 ,这就是结果了。
反正根据我的理解就是,由于除法不能使用同余定理,那么我们就把除以的这个数转化为乘法,然后用同余定理即可。
逆元如果知道了,我们继续说Lucas定理的使用。
先说一下定义:
Lucas 定理:A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0] 这里的每一个数组元素表示其p进制的每一位。
则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])。也就是说,把大组合数问题变成了一个个的小组合数。(A,B小于mod)
对于每一个小组合数,我们继续刚才的说明:n! / ( k! * ( n - k)! ) ,我们要求k!*(n - k)!的逆元。套用上面逆元的求法,再看一下下面的模板,应该就不难理解了。
Lucas定理用递归的方法,代码:
这里用到了快速幂,代码:
对于阶乘,我们可以先打一个表,运算就快很多:
- 关于【逆元】和【lucas定理】
- hdoj 3037 lucas定理+逆元
- 组合数【Lucas定理,逆元】
- Lucas定理 & 逆元学习小结
- Lucas定理+乘法逆元+组合数学(hdu5226)
- 【Lifht-oj】-1067-Combinations(Lucas定理&逆元)
- bzoj 2982: combination lucas定理+乘法逆元
- 组合数计算(Lucas 逆元 中国剩余定理)
- 基于lucas定理线性求所有逆元的方法
- 【Lucas定理 && C(n, m)%p && 逆元】FZU
- BZOJ 1951 费马小定理 + Lucas定理 + 乘法逆元 + 中国剩余定理 + 快速幂
- 关于Lucas定理的证明
- BZOJ 1951 [Sdoi2010]古代猪文 欧拉定理+(扩展)lucas定理+逆元+快速幂
- hdu - 4349 - Xiao Ming's Hope - 大大的Lucas定理 && 小小的乘法逆元
- HDU 3037 Saving Beans (组合+Lucas定理+逆元+快速幂)
- FZU 2020-组合(Lucas定理+逆元解决大组合数求模)
- 数论基础 扩展欧几里得 线性筛 逆元 欧拉函数 Lucas定理
- 关于费马小定理与逆元
- epoll用法详解 优点
- 【HDOJ 5834】Magic boy Bi Luo with his excited tree(树型DP)
- React Native自定义导航栏
- Android Service后台服务进程意外被kill掉之后如何重启
- 网络请求工具类
- 关于【逆元】和【lucas定理】
- 解惑正则表达式中的捕获
- 实现实时索引基本原理
- PHP CURL 笔记
- java设计模式之单例模式
- Ubuntu安装lighttpdweb服务
- Python Twisted介绍
- centos7+nginx+keepalived互为主从
- cocoapods使用教程