组合数的常见计算方法

  • 低级版
    • 方法概述
    • 程序实现
    • 时间复杂度
  • 高级版
    • 方法概述
    • 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定理

其他

分段打表万岁!

组合数的常见计算方法相关推荐

  1. 大数量级组合数的快速计算方法

    转自:大数量级组合数的快速计算方法,保存在此以学习. 计算组合数最大的困难在于数据的溢出,对于大于150的整数n求阶乘很容易超出double类型的范围,那么当C(n,m)中的n=200时,直接用组合公 ...

  2. 组合数的几种常见计算方法

    加法递推 : 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 ...

  3. 相似度的几种常见计算方法

    相似度的计算现有的关于相似度计算的方法,基本上都是基于向量的,也即计算两个向量之间的距离,距离越近越相似.下面是几种常见的相似度计算方法. 1.杰卡德相似系数 Jaccard(杰卡德)相似性系数主要用 ...

  4. python pandas教程百家号_Pandas 常见的基本方法

    说明:文章所有内容均截选自实验楼教程[Pandas 使用教程],想要查看教程完整内容,点击教程即可~ 前言: Pandas 是非常著名的开源数据处理工具,我们可以通过它对数据集进行快速读取.转换.过滤 ...

  5. 09_Fibonacci

    <剑指offer>里面的这道题对fibonacci的常见计算方法进行了改进 #include<iostream> using namespace std;long long F ...

  6. Python常用模块集锦

    常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...

  7. 高等代数 行列式(第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 ...

  8. 计算机算分数的过程,绩点计算器计算程序步骤详解,让成绩单漂亮一点

    分数是评估学业成绩的一种方法.多数国立大学的常见计算方法是:学分/ 10-5,学分=学分*学分=学分*(分数/ 10-5)(90分或更高者被计算为90分).好的.自1985年中国开始推行信用体系实施以 ...

  9. 非线性可视化(5)非线性系统的分岔图

    在前面 非线性可视化(3)混沌系统 这一篇文章中,介绍了一个系统因为某个常数的改变,从而导致整个系统发生变化的例子.比如Duffing系统,随着阻尼d的增大,系统由混沌变为倍周期,又变为周期运动.想要 ...

最新文章

  1. Ubuntu14.04 LTS中安装Ruby 2.4源码操作步骤
  2. Docker网络解决方案-Flannel部署记录
  3. HL7 ADT Message Sample
  4. Stanford NLP 第六课: Long Short Term Memory
  5. 【安装配置】DBCA创建数据库(图形界面)
  6. Kali Linux 下搜狗输入法换肤和设置快捷键
  7. arm开发板与PC通讯及访问外网
  8. PbootCMS制作个性分页条之单页/总页数效果详细介绍教程
  9. 如何去除图片背景颜色?怎样将背景色变透明?
  10. linux的炒股软件“全胜”
  11. 计算机无法找到扫描仪和照相机,我的电脑不显示扫描仪和摄像头的原因及解决方法...
  12. 硬件电路设计之电源电路的设计
  13. vue各类轮播图大全
  14. Java-JUC-彻底搞懂JUC
  15. 《我是一只IT小小鸟》目录I
  16. ata计算机考试第一套,计算机ATA考试中级第一套试题配套素材.doc
  17. python多层遍历批量转换PPT为PDF
  18. MTK Android software Tools工具的说明
  19. QT_文本编辑器_源码下载
  20. HTML进阶--如何使用Sublime Text来创建网页 -------16岁的小前端

热门文章

  1. 了解测序深度用什么软件
  2. 微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案
  3. 视频: 黄立行哥哥黄立成创作歌曲《1937》怒骂日本死不认错
  4. Google正在推广HTTPS
  5. Hive的安装与优化
  6. line vty 0 4 什么意思
  7. 人生感悟之——因果关系
  8. ip-guard邮箱发往外网的邮件必须抄送公司领导
  9. 注意了!你的工资将决定这个冬天你的御寒方式!
  10. QT QTextEdit 控件响应回车键