C++基础数论————排列组合
排列组合的定义:
排列就是从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 , n ] [1,n] [1,n] 中有多少个数能被 x 或 y 整除 例题2: [ 1 ...
- 【Python基础】Python中的高效迭代库itertools,排列组合随便求
本文目录 一.模块概述 二.组合生成器 2.1 product 2.2 permutations 2.3 combinations 2.4 combinations_with_replacement ...
- 数学--数论-多重集排列组合与母函数
一.无重复元素的排列组合定义 排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序 组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑 ...
- 【数论】排列组合学习笔记
目录 简介 加原理和乘法原理 加法原理 乘法原理 两原理的区别 例子 排列 例子 简介 排列组合是组合数学中的一种.排列就是指从给定个数的元素中取出指定个数的元素进行排序:组合则是指从给定个数的元素中 ...
- C++语言基础 —— STL —— 算法 —— 排列组合算法
[概述] 首先要了解什么是 "下一个" 排列组合,什么是 "上一个" 排列组合. 假设有三个数字组成的序列:{a,b,c} 则这个序列有6种可能的排列组合:ab ...
- 数据结构与算法 —— 基础一(排列组合)
排列组合问题 排列和组合问题,其实是两种问题,区分它们的原则是是否需要考虑顺序的不同.排列问题,考虑顺序:组合问题,不考虑顺序. 1.排列可重复 那么,何为"可重复"呢?暂且不考虑 ...
- 【数论】 排列组合中的隔板问题
排列组合中的可以一个空插多个隔板的问题 但是现在要解决的情况是盒子可以分不到球.这样我们通过一步化归,转换为上面的情况:添加 nn 个球,使每个盒子至少有一个球.这样分完后只要将每个盒子多拿的一个球收 ...
- 概率论基础__排列与组合
在古典概型中, 计算事件的概率经常用到排列组合及其总数计算公式, 在此给出排列组合的定义及其相关公式. 一. 两个基本原理 1. 乘法原理 如果某件事需经 k 步才以完成, 做第一步有 m₁种方法, ...
- 算法之基础数论应用篇(一)
基础数论应用篇 子集和 题目描述 筛质数 筛质数模板 欧拉筛 线性筛 哥德巴赫猜想 夏洛克和他的女朋友 二次筛法 分解质因数 试除法分解质因数 分解阶乘质因子 快速幂 模板 快速幂 快速乘法 序列的第 ...
最新文章
- Windows下安装Redis服务
- oracle 实现基于函数的索引
- 明明连上了网,但是打不开网页
- 86. Leetcode 264. 丑数 II (动态规划-基础题)
- python——input() 的用法及扩展
- Android 全局悬浮按钮,悬浮按钮点击事件
- FastReport问题整理(转)
- ASP.NET下QueryString不同字符编码间强制转换的解决方案
- 在JS中如何判断所输入的是一个数、整数、正数、非数值?
- android自动播放mp3,audio标签移动端(微信)实现自动播放
- linux指令 sed,Linux命令sed
- Java生成.jar库
- Android修改高度,android – 如何在运行时更改软键盘的高度?
- js文件、图片上传(原生方法和jquery的ajax两种都有)
- Pwn2Own黑客大赛战况:iPhone 20秒被黑
- Request,Request.Form,Request.QueryString
- java linux怎么抓tcp包_Linux使用tcpdump抓取网络数据包示例
- 人工智能 图片识别 图像识别
- WebService原理浅析
- 泪目!这篇博士论文致谢走红:感谢博一与我结婚的妻子...