组合数的常见计算方法
组合数的常见计算方法
- 低级版
- 方法概述
- 程序实现
- 时间复杂度
- 高级版
- 方法概述
- Lucas定理
- exLucas定理
- 其他
低级版
方法概述
直接用组合数性质中的③式递推即可
程序实现
int mod,c[2010][2010];
int C(int n)
{for(int i=0;i<=n;i++) c[i][0]=1;c[1][1]=1;for(int i=2;i<=n;i++) for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
时间复杂度
Θ ( n 2 ) \Theta (n^2) Θ(n2)
高级版
方法概述
这一种求组合数的方法用到了一个著名的定理——Lucas定理!
我们先来了解一下这个神奇的定理
Lucas定理
设 p p p为质数, ( n m ) ≡ ( n / p m / p ) ( n % p m % p ) ( m o d p ) \binom{n}{m}\equiv\binom{n/p}{m/p}\binom{n\%p}{m\%p}\pmod{p} (mn)≡(m/pn/p)(m%pn%p)(modp)
证明:设 n = s p + q , m = t p + r n=sp+q,m=tp+r n=sp+q,m=tp+r且 q , r < p q,r<p q,r<p
∵ ( 1 + x ) p ≡ ( 1 + x p ) ( m o d p ) \because (1+x)^p\equiv (1+x^p)\pmod{p} ∵(1+x)p≡(1+xp)(modp)(费马小定理)
∴ ( 1 + x ) n ≡ ( 1 + x ) p s ( 1 + x ) q ≡ ( 1 + x p ) s ( 1 + x ) q = ∑ i = 0 s ( s i ) x i p × ∑ j = 0 q ( q j ) x j = ∑ i = 0 s p + q ( s p + q i ) x i ( m o d p ) \therefore (1+x)^n\equiv (1+x)^{ps}(1+x)^q\equiv\left(1+x^p\right)^s(1+x)^q=\sum \limits_{i=0}^s\binom{s}{i}x^{ip}\times \sum \limits_{j=0}^{q}\binom{q}{j}x^j=\sum \limits_{i=0}^{sp+q}\binom{sp+q}{i}x^i\pmod{p} ∴(1+x)n≡(1+x)ps(1+x)q≡(1+xp)s(1+x)q=i=0∑s(is)xip×j=0∑q(jq)xj=i=0∑sp+q(isp+q)xi(modp)
∴ ( s t ) ( q r ) ≡ ( s p + q t p + r ) ≡ ( n m ) ( m o d p ) \therefore \binom{s}{t}\binom{q}{r}\equiv\binom{sp+q}{tp+r}\equiv \binom{n}{m}\pmod{p} ∴(ts)(rq)≡(tp+rsp+q)≡(mn)(modp)( x t p + r x^{tp+r} xtp+r的系数)
∴ ( n m ) ≡ ( n / p m / p ) ( n % p m % p ) ( m o d p ) \therefore \binom{n}{m}\equiv\binom{n/p}{m/p}\binom{n\%p}{m\%p}\pmod{p} ∴(mn)≡(m/pn/p)(m%pn%p)(modp)
有了这个定理,我们就可以用来解决 p p p为质数的情况了,只需要递归一下就可以了
但是 p p p不是质数呢?那肯定是出题人看你不爽,故意搞你
这时候,我们就要请出我们的救星——exLucas定理!
exLucas定理
exLucas定理
其他
分段打表万岁!
组合数的常见计算方法相关推荐
- 大数量级组合数的快速计算方法
转自:大数量级组合数的快速计算方法,保存在此以学习. 计算组合数最大的困难在于数据的溢出,对于大于150的整数n求阶乘很容易超出double类型的范围,那么当C(n,m)中的n=200时,直接用组合公 ...
- 组合数的几种常见计算方法
加法递推 : o ( n ∗ n ) o(n*n) o(n∗n) 公式: C ( m n ) C\tbinom{m}{n} C(nm) = C ( m n − 1 ) C\tbinom{m}{n-1 ...
- 相似度的几种常见计算方法
相似度的计算现有的关于相似度计算的方法,基本上都是基于向量的,也即计算两个向量之间的距离,距离越近越相似.下面是几种常见的相似度计算方法. 1.杰卡德相似系数 Jaccard(杰卡德)相似性系数主要用 ...
- python pandas教程百家号_Pandas 常见的基本方法
说明:文章所有内容均截选自实验楼教程[Pandas 使用教程],想要查看教程完整内容,点击教程即可~ 前言: Pandas 是非常著名的开源数据处理工具,我们可以通过它对数据集进行快速读取.转换.过滤 ...
- 09_Fibonacci
<剑指offer>里面的这道题对fibonacci的常见计算方法进行了改进 #include<iostream> using namespace std;long long F ...
- Python常用模块集锦
常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...
- 高等代数 行列式(第2章)
零.2阶行列式 1.概念: 对二元一次方程组{a11x1+a12x2=b1a21x1+a22x2=b2\begin{cases}a_{11}x_1+a_{12}x_2=b_1\\a_{21}x_1+a ...
- 计算机算分数的过程,绩点计算器计算程序步骤详解,让成绩单漂亮一点
分数是评估学业成绩的一种方法.多数国立大学的常见计算方法是:学分/ 10-5,学分=学分*学分=学分*(分数/ 10-5)(90分或更高者被计算为90分).好的.自1985年中国开始推行信用体系实施以 ...
- 非线性可视化(5)非线性系统的分岔图
在前面 非线性可视化(3)混沌系统 这一篇文章中,介绍了一个系统因为某个常数的改变,从而导致整个系统发生变化的例子.比如Duffing系统,随着阻尼d的增大,系统由混沌变为倍周期,又变为周期运动.想要 ...
最新文章
- Ubuntu14.04 LTS中安装Ruby 2.4源码操作步骤
- Docker网络解决方案-Flannel部署记录
- HL7 ADT Message Sample
- Stanford NLP 第六课: Long Short Term Memory
- 【安装配置】DBCA创建数据库(图形界面)
- Kali Linux 下搜狗输入法换肤和设置快捷键
- arm开发板与PC通讯及访问外网
- PbootCMS制作个性分页条之单页/总页数效果详细介绍教程
- 如何去除图片背景颜色?怎样将背景色变透明?
- linux的炒股软件“全胜”
- 计算机无法找到扫描仪和照相机,我的电脑不显示扫描仪和摄像头的原因及解决方法...
- 硬件电路设计之电源电路的设计
- vue各类轮播图大全
- Java-JUC-彻底搞懂JUC
- 《我是一只IT小小鸟》目录I
- ata计算机考试第一套,计算机ATA考试中级第一套试题配套素材.doc
- python多层遍历批量转换PPT为PDF
- MTK Android software Tools工具的说明
- QT_文本编辑器_源码下载
- HTML进阶--如何使用Sublime Text来创建网页 -------16岁的小前端