组合数涉及的问题很多,求解过程中涉及的定理判定也有很多,期间断断续续参考了很多大佬们的博客,最终进行了总结。在此我使用用问题引入算法的方法来一步一步了解组合数

简单的组合数问题(运用快速幂及递归实现杨辉三角)

组合数求解

  • 像关于组合数求和问题如∑ Cni(0<=i<=n) 可利用快速幂,此时∑ Cni = 2^n

    此为二项式定理推导出的结果 练习题可见洛谷P3414

  • 若求较小的组合数如C(n,m)(m<=n<=1000 保守估计1000,实际可能可以更大些,但不会超数量级)可直接利用杨辉三角的法则来计算组合数C(n,m)=C(n-1,m-1)+C(n-1,m)。以下为杨辉三角的简单介绍和理解:

杨辉三角简单介绍


性质

1.每个数等于它上方两数之和–>最重要的一个性质

2.每行数字左右对称,由1开始逐渐变大–>由第5个性质可知

3.第n行的数字有n项

4.第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数

5.第n行的第m个数和第n-m+1个数相等,为组合数性质之一,即C(n,m)==C(n,n-m+1)

6.每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。

7.(a+b)n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项–>二项式定理

杨辉三角还有其他性质(例如斐波那契数列与其的关系)在此不做说明

由第6个性质可知上面第二类问题C(n,m)=C(n-1,m-1)+C(n-1,m)的来由

但是,利用杨辉三角递归,只可以处理n,m较小的组合数。当n,m很大时,我们如何求解呢?


较复杂的组合数问题(n,m较大时)

逆元在组合数中的应用

对欧拉-费马小定理的理解

在了解逆元之前,需要先了解欧拉-费马小定理,并有此推导逆元(如果已经了解了欧拉-费马小定理,可直接跳到标题:通过逆元计算组合数 )

欧拉定理: 若正整数 a , n 互质(公因数只有1),则 aφ(n)≡1(mod n) 其中 φ(n) 是欧拉函数,此函数代表(1~n) 与 n 互质的数的个数。

简单证明:

令 x1 x2 x3…xφ(n) 为1-n中与n互质的数 (互质即gcd(m,n)=0)

我们先来研究 ax1 ax2 ax3… axφ(n) 这一队数列

**其必有任意两个元素mod n 不相同 **

反证:若存在ax1 ≡ ax2(mod n),则 n |( ax1 - ax2 )即n可以整除( ax1 - ax2 )

而(ax1-ax2)/n ==(x1-x2)/n * a 或 a/n * (x1-x2) ;

第一种除法由于 (x1-x2)< n ∴一定除不开

第二种除法由于 a和 n互质 ∴也一定除不开。综上不可能存在ax1 ≡ ax2(mod n),得证。

且∵ a与n互质 所以 axi 与n也互质 所以根据欧几里得算法(辗转相除法)有gcd(axi,n)1 所以:gcd(axi,n) gcd(n,axi%n)== 1

又∵ax1%n, ax2%n, ax3%n… axφ(n)%n 均小于 n,且ax1%n, ax2%n, ax3%n… axφ(n)%n又都与n互质

∴ ax1%n, ax2%n, ax3%n… axφ(n)%n必为x1 x2 x3…xφ(n) 以一定顺序排列而成的。

那么必有:ax1%n, ax2%n, ax3%n… axφ(n)%n = x1 x2 x3…xφ(n)

自然就有 ax1%n, ax2%n, ax3%n… axφ(n)%n ≡ x1 x2 x3…xφ(n) (mod n)

即 ax1 ax2 ax3 … axφ(n) ≡ x1 x2 x3…xφ(n) (mod n),把x1 x2 x3…xφ(n) 移到左边(因为肯定不会出现小数,所以可以直接移)

∴有 **(aφ(n)-1)x1 x2 x3…xφ(n) ≡ 0 (mod n) **

又∵x1 x2 x3…xφ(n) 均与 n互质

∴自然有(aφ(n)-1) ≡ 0 (mod n)

∴ 证得 aφ(n)≡1(mod n)

接下来,我们利用欧拉定理,简单证明费马小定理

费马小定理:对于质数p,任意整数,均满足:ap≡a(mod p)

简单证明:

由于 ap≡a(mod p)∴有ap-1≡1 (mod p) 这和 aφ(n)≡1(mod n)类似,所以只需证明p-1φ(n)即可,且因为p是一个质数,易得与其互质的数为1,2,3…p-1,共p-1个所以有p-1φ(n),得证

(注意:若有a是p的倍数,则一定有ap≡a≡0(mod p),不必证明)

(拓展)欧拉定理的推论:若正整数a,n互质,那么对于任意正整数b,有ab≡ab mod φ(n)(mod n)

简单证明:若ab ≡ ab mod φ(n)(mod n)则有ab-b mod φ(n)≡ 1(mod n),因为φ(n)| b-b mod φ(n) 所以令 p=(b-b mod φ(n))/φ(n) ∴即证(ap)φ(n)≡1 (mod n) 易得ap和 n是互质的 所以得证

以上引用,总结自:https://www.cnblogs.com/zylAK/p/9569668.html (这篇博客里还有一道例题,想具体了解欧拉定理推论可以去看一下)

通过逆元计算组合数

首先了解逆元的定义:

逆元:对于a和p(a和p互素),若a*b%p≡1,则称b为a的逆元。(mod p的情况下)

首先,我们弄清,为什么求组合数需要用到逆元呢?

此时我们就需要使用上面

组合数计算(从1000到1e9的组合数各类求法)相关推荐

  1. 编程示例:计算组合数c(2000,1000)

    编程示例:计算组合数c(2000,1000) 组合数的计算公式是 c(m,n)=m!/n!/(m-n)! 所以它的计算是依赖于阶乘的计算,当n>21时n!的结果值超出了编程语言的整数表示范围的最 ...

  2. 纪中集训2020.02.05【NOIP提高组】模拟B 组总结反思——【佛山市选2010】组合数计算,生成字符串 PPMM...

    目录 JZOJ2290. [佛山市选2010]组合数计算 比赛时 之后 JZOJ2291. [佛山市选2010]生成字符串 比赛时 之后 JZOJ2292. PPMM 比赛时 之后 JZOJ2290. ...

  3. 输入在一行中给出两个正整数m和n(m≤n),以空格分隔。按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。建议定义和调用函数fact(n)计算n!

    本题要求编写程序,根据公式C​n​m​​=​m!(n−m)!​​n!​​算出从n个不同元素中取出m个元素(m≤n)的组合数. 建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是 ...

  4. MATLAB计算阶乘、排列数与组合数

    在1500件产品中有400件次品,1100件正品,任取200件 求恰有90件次品的概率; 求至少有两件次品的概率. 这是一道古典概型的概率问题,题目比较简单,很容易求得概率,其中 但是,计算量较大,于 ...

  5. python 求组合数最快方法_利用Python进行组合数计算

    如何利用Python来实现数学组合计算?一起来看看吧~ 前言 开学几个星期了emmm 作业一如既往的多....... 在做数学的时候经常要算组合数,奈何我的计算机太水了(其实是我懒哈哈) 正好最近学P ...

  6. 组合数计算的几种方法

    组合数计算的几种方法 方法一.公式法(此方法适合n和m都很小时使用) 公式:C(n,m)=C(n-1,m)+C(n-1,m-1) 我们在进行计算时可以采用动态规划的方法 代码描述: static lo ...

  7. 组合数计算出现浮点误差的问题python

    #首先组合数公式C(n,m)可以简单化简,例如C(8,5)=C(8,3)=(8*7*6)/(3*2*1),m或n-m为几,分式上下就有几 #个数.def cni(n,i):#原函数minNI = mi ...

  8. 组合数函数-快速提取所有可能的组合数

    组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数. 代码: str_comb <- function(vector){n <- le ...

  9. 用C语言编辑得到的利息,存款利息的计算 有1000元,想存5年,可按以下5种办法存:...

    存款利息的计算.有1000元,想存5年,可按以下5种办法存: (1)一次存5年期 (2)先存2年,到期后将本息再存3年期 (3)先存3年,到期后将本息再存2年期 (4)存1年期,到期后将本息再存1年期 ...

  10. 银行存款利率C语言程序设计,存款利息的计算 有1000元,想存5年,可按以下5种办法存:...

    存款利息的计算.有1000元,想存5年,可按以下5种办法存: (1)一次存5年期 (2)先存2年,到期后将本息再存3年期 (3)先存3年,到期后将本息再存2年期 (4)存1年期,到期后将本息再存1年期 ...

最新文章

  1. OSSIM系统——mysql的使用
  2. 计算机在线声音,电脑怎么在线录音
  3. php Session存储到Redis的方法
  4. 【面试招聘】算法岗通关宝典 | 社招一年经验,字节5轮、阿里7轮
  5. 为了方便大家下载四级资料,开通FTP
  6. 【OpenGL从入门到精通(二)】绘制一个点
  7. Redis内部数据结构-跳跃表
  8. windows Tracert命令
  9. 令人期待的php7.4,PHP7.4新特性
  10. 212.样本量和测序深度的Alpha多样性稀释曲线
  11. JS-Global对象
  12. html app签名,html5手写签名
  13. 20135220谈愈敏-期末总结
  14. python魔方方法__call__
  15. epub 阅读器 android,如何使一个epub阅读器和显示为android
  16. matlab里晶闸管,基于MATLAB的晶闸管-直流电动机控制系统的仿真研究
  17. 数据库中的参照完整性(Foreign Key)
  18. appium向右滑动
  19. Intel笔记本CPU大全
  20. Python_p2_class

热门文章

  1. ai跟随路径_ai中图像怎么沿着路径走
  2. 浦发招聘笔试计算机部分考啥,2019浦发银行校园招聘考试题型及题量分布
  3. 如何解决克隆虚拟出现的Device eth0 does not seem to be present,delaying initialization错误
  4. 512 排序预演_最小数置前
  5. 练习京东顶部导航条、背景、渐变、按钮练习(雪碧图)、渐变
  6. 陈强老师公开课笔记1——如何区别中介效应、调节效应与交互效应?
  7. 【模电】共射放大电路(直接耦合+阻容耦合、NPN)
  8. bertram_Bertram
  9. python中分号中没内容_被“嫌弃”的分号的一生:不要在Python中使用无用分号了...
  10. python识别文字并且提示_Python识别文字,实现看图说话|CSDN博文精选