【数论】排列组合问题
排列
定义:
从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示
公式:
A(n,m)=n(n-1)*(n-2)*……*(n-m+1)= n!/(n-m)!
PS:此外规定0!=1
特殊排列:
- 不全相异元素的排列:
在n个元素中 n1个元素彼此相同 有n2个元素彼此相同......有nm个元素彼此相同 并且n1+n2+...+nm=n
其排列数公式为:n!/(n1!*n2!*...*nm!)
【引例】把3个相同的黄球 2个相同的蓝球 4个相同的白球排成一排 有(3+2+4)!/(3!*2!*4!)=1260
- 圆排列
从n个数中取m个 不分首尾地排成一个圆圈的排列叫做圆排列 方案数为A(n,m)/m=n!/(m*(n-m)!)
组合
定义:
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示
公式:
C(n,m)=A(n,m)/m!=n!/(m!(n-m)!) 因为多出了一个全排列需要删去
可重复组合:从n个元素中 取出r个元素组成一个组合 且允许这r个重复使用 记为H(n,r)=C(n+r-1,r)
性质:
- C(n,m)=C(n,n-m) 规定:C(n,0)=C(n,n)=1
- C(n+1,m)=C(n,m)+C(n,m-1) 杨辉三角递推
二项式定理:
(a+b)n=Σni=0C(n,i)a(n-i)bi
二项式系数:C(n,i) 运用杨辉三角
【例题】洛谷P1313 [NOIP2011TG]计算系数:https://www.luogu.org/problemnew/show/P1313
题解链接:https://www.cnblogs.com/BrokenString/p/9665237.html
Lucas定理
定义:
Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p)
Lucas定理是用来求C(n,m) mod p的值,p是素数。
#include<iostream> #include<cstdio> using namespace std; #define LL long long LL T,n,m,p; LL quickpow(LL a,LL b) {LL ret=1;while(b){if(b&1) ret=ret*a%p;a=a*a%p;b>>=1;}return ret; } LL C(LL n,LL m) {if(m>n) return 0;LL a=1,b=1;for(LL i=n-m+1;i<=n;i++)a=a*i%p;//计算n!/(n-m)! for(LL i=2;i<=m;i++)b=b*i%p;//计算1/m! return a*quickpow(b,p-2)%p;//费马小定理求逆元 } LL Lucas(LL n,LL m) {if(!m) return 1;else return (C(n%p,m%p)*Lucas(n/p,m/p))%p;//递推公式 } int main() {scanf("%lld",&T);while(T){T--;scanf("%lld%lld%lld",&n,&m,&p);printf("%lld\n",Lucas(n,m));} }
View Code
Catalan数列
定义:
给定n个0和n个1,它们按照某种顺序排成长度为2n的序列 满足任意前缀中0的个数都不少于1的个数的序列数量为:Catn=C(2n,n)/(n+1)
有关题目:
- n个左括号和n个右括号组成的合法括号序列数量为Catn
- 1,2...n经过一个栈 形成合法的出栈顺序数量为Catn
- n个节点构成的不同二叉树的数量为Catn
- 在平面直角坐标系上 每步只能向上或者向右走 从(0,0)到(n,n)并且除两个端点外不接触直线y=x的路线数量为2Catn
- 在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)
- n层的阶梯切割为n个矩形的切法数
这里给出一个较为详细的dalao的blog:https://blog.csdn.net/duanruibupt/article/details/6869431
小技巧:
如果看到
n=1,answer=1;
n=2,answer=2;
n=3,answer=5;
n=4,answer=14;
n=5,answer=42;
基本可以往卡特兰数方面想..
转载于:https://www.cnblogs.com/BrokenString/p/9664899.html
【数论】排列组合问题相关推荐
- C++基础数论————排列组合
排列组合的定义: 排列就是从n个数中找出m个进行排列,共有多少种方案? 这一定要考虑顺序. 公式就是: 而组合就从从n个数中找出m个进行组合,共有多少种方案? 这一定不要考虑顺序. 公式就是: 现在, ...
- 组合数学(排列组合,容斥原理,数论定理)
组合数学的学习 排列组合 一.排列组合基础 二.排列组合练习题 容斥原理 定理学习 例题练习 例题1: [ 1 , n ] [1,n] [1,n] 中有多少个数能被 x 或 y 整除 例题2: [ 1 ...
- 【数论】排列组合学习笔记
目录 简介 加原理和乘法原理 加法原理 乘法原理 两原理的区别 例子 排列 例子 简介 排列组合是组合数学中的一种.排列就是指从给定个数的元素中取出指定个数的元素进行排序:组合则是指从给定个数的元素中 ...
- 数学--数论-多重集排列组合与母函数
一.无重复元素的排列组合定义 排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序 组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑 ...
- 【数论】 排列组合中的隔板问题
排列组合中的可以一个空插多个隔板的问题 但是现在要解决的情况是盒子可以分不到球.这样我们通过一步化归,转换为上面的情况:添加 nn 个球,使每个盒子至少有一个球.这样分完后只要将每个盒子多拿的一个球收 ...
- 信奥中的数学:排列组合
排列组合题型总结课程(一) 排列组合题型总结课程(一)_哔哩哔哩_bilibili 排列组合的公式 排列组合的公式_百度知道 [Manim动画]如何以可视化视角直观理解排列组合? [Manim动画]如 ...
- 排列组合公式 与24点编程游戏
排列组合公式 此外, 规定0! = 1. 24点游戏编程问题 问题描述 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [ ...
- java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值
null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...
- php 1到9加,php通过排列组合实现1到9数字相加都等于20的方法
摘要:本文实例讲述了php通过排列组合实现1到9数字相加都等于20的方法.分享给大家供大家参考.具体实现方法如下:<?php set_time_limit(0); /* 函数说明:huoqu_z ...
- 论排列组合,持续更新
今天刚好碰到了一个排列组合问题,因为之前对这方面的学习比较少,所以用的非常蠢的方法做了四位数中取三位的排列,写的程序太有局限性,源码如下 #define _CRT_SECURE_NO_WORNINGS ...
最新文章
- 如果不发论文,我们用什么证明自己的科研实力?
- javaScript原生定义的函数
- 为什么不要使用finalize方法
- Mysql(五) JDBC
- SessionStorage 和 LocalStorage 生命周期 以及 浏览器刷新操作意味着什么?
- css --- flex:n的解析
- 有上下界网络流问题汇总
- 装配图位置偏转怎么调整_物理微课|匀变速直线运动、电容器动态分析及磁偏转技巧、方法、模型...
- Kubernetes 上调试 distroless 容器
- 单片机交通灯的电路图以及代码_单片机晶振“问答篇”(下),17大单片机晶振问题全解答...
- 7723java版_绝代双骄_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
- VMware 虚拟机下载与安装
- matlab画图入门教程
- 联咏Novatek_NT98566(对标Sigmastar SSC337)_IMX335单板_IPC模组开发案例
- 2021年最新程序员培训机构排名,学习前避坑必看
- 飞天云动能否一飞冲天?
- 实验一 简单静态网页设计
- 【云计算的1024种玩法】搭建个人博客
- 元数据管理与数据质量保障
- php计算第几周,php计算当前是一年或一月中第几周的函数