组合数取模(sdut3895+HDU3037)逆元法或Lucas
来源:互联网 发布:淘宝开店流程图解2016 编辑:程序博客网 时间:2024/06/11 00:36
组合数取模有三种方法
第一种是杨辉三角用数组跑,时间复杂度高
第二种使用逆元法求,适用于m,n较小,而mod较大的情况
第三种是Lucas定理适用于n,m较大的情况;
逆元法
记需要区域的数mod为p
p要求是质数,不然就GG吧
所以需要把“除法”转换成“乘法”,才能借助取模的性质在不爆long long的情况下计算组合数。这时候就需要用到“逆元”!
逆元:对于a和p,若a*b%p≡1,则称b为a%p的逆元。
你愿的求法有两种,一种是扩展欧几里得求逆元,转换成同余方程,另一种就是当p是质数时强大的费马小定理;
扩展欧几里得
a与b互质,存在n,m使方程am+bn=gcd(a,b)=1成立
a*m%b+0=1成立
m就是a%b的逆元.
求逆元代码:
long long inv(long long a,long long p){ long long x,y; long long d=extend_gcd(a,p,x,y); if(d==1) return (x%n+n)%n; else return -1;}long long extend_gcd(long long a,long long b,long long &x,long long &y){ if(a==0&&b==0)return -1; if(b==0) { x=1; y=0; return a; } long long d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d;}
简便写法:
//a<plong long inv(long long a,long long p){ if(a==1) return 1; return inv(p%a,p)*(p-p/a)%p}
费马小定理:
sdut3895(2017山东省赛C题)就是逆元求组合数的题目,不能用卢卡斯定理,TLE,TLE,TLE……….
SDUT3895题目链接
2017山东省赛C题题解
Lucas定理(大部分情况 p<105 )
这样我们就可以用逆元法求出
Lucas定理模板(C(m,n)代表
long long Lucas(long long n,long long m) { if(m==0) return 1; return Lucas(n/p,m/p)*C(n%m,m%p)%p; }
HDU3037传送门
HDU3037题解代码
阅读全文
0 0
- 组合数取模(sdut3895+HDU3037)逆元法或Lucas
- 组合数取模(sdut3895+HDU3037)逆元法或Lucas
- hdu3037 lucas 定理 组合数取模
- hdu3037 大组合数取模(Lucas定理)
- HDU3037(Lucas定理求大组合数取模)
- hdu3037 组合数 lucas定理
- 【日常学习】【组合数取模Lucas定理】HDU3037 Saving Beans题解
- HDU3037——Saving Beans(数论,组合数取模,lucas定理模板)
- hdu3037 Saving Beans (lucas定理+组合数公式)
- [HDU3037]Saving Beans(组合数学Lucas定理)
- hdu3037 隔板法+Lucas定理求大组合取模
- 数论 Lucas定理 hdu3037
- HDU3037(Lucas定理)
- hdu3037 LUCAS定理运用。
- Lucas定理&&hdu3037
- lucas定理(hdu3037,)
- Lucas模板 hdu3037
- hdu3037(卢卡斯定理+组合数取模)
- Linux 设备树学习
- DOM模型
- 输入法泄露处理工具类
- F
- 微信小程序rsa分段加密
- 组合数取模(sdut3895+HDU3037)逆元法或Lucas
- ScrollView与ListView的嵌套冲突
- KMP算法原理
- 线索化二叉树
- POJ2891 Strange Way to Express Integers 同余式的合并操作(中国剩余定理两两不一定非素的替代)
- unity3d-2017.1.0f3版本初探-界面
- 设计模式之六大原则——接口隔离原则(ISP)
- redhat 配置本地yum源163yum源epel 源
- linux之软硬链接