排列组合的定义:

排列就是从n个数中找出m个进行排列,共有多少种方案?

这一定要考虑顺序。

公式就是:

而组合就从从n个数中找出m个进行组合,共有多少种方案?

这一定不要考虑顺序。

公式就是:

现在,我们来看一看它的性质:

而我们该如何计算组合数呢?

计算组合数:

这一共有2种方法。

1、根据定义直接暴力求出组合数,但是其时间复杂度较长而且有溢出的风险,所以不推荐使用。

2、根据我们可以通过递推的方法来解决。代码如下:

递归

int dg( int x , int y )
{if( y==0 )return 1;int p = dg( x - 1 , y - 1 ) * x / y;return p;
}

递推

long long s1=n-m+1;
ans=1;
for(int i=1;i<=m;i++)
{ans*=s1;ans/=i;s1++;
}

现在,学会了计算组合数的方法,开始例题吧。

题目描述:

14本不同的书分成6堆,每堆的本数分别为1,2,2,3,3,3

共有多少分法?

解题思路:

首先,这些都是不同的书,所以我们可以分布计算方案书。

1、先取一本书   

2、再取2本书    

3、又取2本书    

4、再拿3本书    

5、还拿3本书    

6、最后取剩下的书     

7、但是6堆是相同的,需要排除6堆顺序的情况     

当然,组合数的定理并不止这些,现在我们就来了解其他定理吧。

组合数的拓展定理:

杨辉三角:

相信杨辉三角大家都是十分熟悉的,而它也可以表示多项式的每项系数(初中课本其实讲过)。

而它的递推公式为(不难看出,n是杨辉三角的行数也是被取数,m是杨辉三角的列数也是取数)。

这样我们就可以通过杨辉三角来打出对应的组合数。

代码如下:

void yanghui()
{for(int i=0; i<=maxn; i++)c[i][0]=1;for(int i=1; i<=maxn; i++)for(int j=1; j<=maxn; j++)c[i][j]=c[i-1][j]+c[i-1][j-1];
}

二项式定理:

我们将这样形式的式子称为二项式。其展开式的每一项的a,b的次数之和为n。

是不是感觉很神奇,更神奇的还在后面。

的系数就是

为什么?理由如下:

=(共有n项)。

就相当于有k个提供a,还有n-k个提供b。

总共的方案数就是了。

Lucas定理:

适用于m,n很大,但P在10w左右的量级,这可以更好的推出较大的组合数。

代码如下:

int Lucas(int n,int m)
{if(n==0||m==0)return 1;elsereturn Lucas(n%p,m%p)*Lucas(n/p,m/p)%p;
}

组合数奇偶性:

若中间有一步m%2=1且n%2=0,那么%2=0。

也就是说,若m二进制某一位是1,那么n的二进制那一位也必须是1。

用位运算表示为(n&m)==m。

其它数论博客:

C++初等数论同余——欧拉函数与CRT

解二元一次方程————拓展欧几里得算法

C++基础数论————排列组合相关推荐

  1. 组合数学(排列组合,容斥原理,数论定理)

    组合数学的学习 排列组合 一.排列组合基础 二.排列组合练习题 容斥原理 定理学习 例题练习 例题1: [ 1 , n ] [1,n] [1,n] 中有多少个数能被 x 或 y 整除 例题2: [ 1 ...

  2. 【Python基础】Python中的高效迭代库itertools,排列组合随便求

    本文目录 一.模块概述 二.组合生成器 2.1 product 2.2 permutations 2.3 combinations 2.4 combinations_with_replacement ...

  3. 数学--数论-多重集排列组合与母函数

    一.无重复元素的排列组合定义 排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序 组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑 ...

  4. 【数论】排列组合学习笔记

    目录 简介 加原理和乘法原理 加法原理 乘法原理 两原理的区别 例子 排列 例子 简介 排列组合是组合数学中的一种.排列就是指从给定个数的元素中取出指定个数的元素进行排序:组合则是指从给定个数的元素中 ...

  5. C++语言基础 —— STL —— 算法 —— 排列组合算法

    [概述] 首先要了解什么是 "下一个" 排列组合,什么是 "上一个" 排列组合. 假设有三个数字组成的序列:{a,b,c} 则这个序列有6种可能的排列组合:ab ...

  6. 数据结构与算法 —— 基础一(排列组合)

    排列组合问题 排列和组合问题,其实是两种问题,区分它们的原则是是否需要考虑顺序的不同.排列问题,考虑顺序:组合问题,不考虑顺序. 1.排列可重复 那么,何为"可重复"呢?暂且不考虑 ...

  7. 【数论】 排列组合中的隔板问题

    排列组合中的可以一个空插多个隔板的问题 但是现在要解决的情况是盒子可以分不到球.这样我们通过一步化归,转换为上面的情况:添加 nn 个球,使每个盒子至少有一个球.这样分完后只要将每个盒子多拿的一个球收 ...

  8. 概率论基础__排列与组合

    在古典概型中, 计算事件的概率经常用到排列组合及其总数计算公式, 在此给出排列组合的定义及其相关公式. 一. 两个基本原理 1. 乘法原理 如果某件事需经 k 步才以完成, 做第一步有 m₁种方法, ...

  9. 算法之基础数论应用篇(一)

    基础数论应用篇 子集和 题目描述 筛质数 筛质数模板 欧拉筛 线性筛 哥德巴赫猜想 夏洛克和他的女朋友 二次筛法 分解质因数 试除法分解质因数 分解阶乘质因子 快速幂 模板 快速幂 快速乘法 序列的第 ...

最新文章

  1. Windows下安装Redis服务
  2. oracle 实现基于函数的索引
  3. 明明连上了网,但是打不开网页
  4. 86. Leetcode 264. 丑数 II (动态规划-基础题)
  5. python——input() 的用法及扩展
  6. Android 全局悬浮按钮,悬浮按钮点击事件
  7. FastReport问题整理(转)
  8. ASP.NET下QueryString不同字符编码间强制转换的解决方案
  9. 在JS中如何判断所输入的是一个数、整数、正数、非数值?
  10. android自动播放mp3,audio标签移动端(微信)实现自动播放
  11. linux指令 sed,Linux命令sed
  12. Java生成.jar库
  13. Android修改高度,android – 如何在运行时更改软键盘的高度?
  14. js文件、图片上传(原生方法和jquery的ajax两种都有)
  15. Pwn2Own黑客大赛战况:iPhone 20秒被黑
  16. Request,Request.Form,Request.QueryString
  17. java linux怎么抓tcp包_Linux使用tcpdump抓取网络数据包示例
  18. 人工智能 图片识别 图像识别
  19. WebService原理浅析
  20. 泪目!这篇博士论文致谢走红:感谢博一与我结婚的妻子...

热门文章

  1. 【云原生生态圈】:Docker核心技术全面总结
  2. 写一个trim函数,兼容IE firefox chrome(正则)
  3. 自动化测试的目标和投入产出比
  4. 【254期】这些 SQL 语句真是让我干瞪眼!
  5. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了
  6. Java OOP 第三章 多态
  7. 365水壶问题(数学)
  8. SAP 销售订单批量可用性检查(ATP)
  9. 【ftp】ftp服务器无法登录的解决办法
  10. 如何计算ip地址及子网掩码