目录
特别鸣谢徐哥的PPT和精彩讲解
不可重复排列
从n个物品中不可重复的取出m个物品
n:待排列数组的长度
cur:已经排列的元素个数
A[]:存储排列后的元素
vis[]:标记数组
当前元素选择完之后记得恢复变量
可重复排列
从n个物品中可重复的取出m个物品
last表示上一个选择,vis_P表示pick,当前元素挑选数量,vis_A表示当前元素挑选上限
求全排列函数(基本不用)
next_permutation和prev_permutation()
圆排列
循环排列(circular permutation)亦称圆排列、环排列等。是排列的一种,指从n个不同元素中取出m(1≤m≤n)个不同的元素排列成一个环形,既无头也无尾。两个循环排列相同当且仅当所取元素的个数相同并且元素取法一致,在环上的排列顺序一致。
这4种取法一致,排列顺序一直,只能算一种
不尽相异元素全排列
10步走完:10步一级台阶
9步走完:1步两级,8步一级 9!/(8!*1!)
……
6步走完:4步两级,2步一级 6!/(4!*2!)
5步走完:5步两级台阶
4,3,2,1无法完成
二项式定理
杨辉三角↑
常见恒等式
这个意思就是Cnk,n是下标k是上标,CSDN的公式栏我找不到……
高中的式子,套公式恒等
套公式恒等
x=1带入即可
组合分析法
容斥原理
要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。
例题
给定r,n求[1,r]内与n互素的个数有多少个?
i<<tail是状态压缩,比如k的质因子有2,3,5,7,那么i左移4位,为10000,这4个0中每有1个变成1就代表着选中了一个质因子,比如10001为选中了2,11101选中了2,5,7,具体实现为(i>>j)&1
cnt是奇数相加,偶数相减,图片打错了
这个是容斥原理,你遇到2相加了,遇到3相加了,遇到2*3就应该减回来
错排问题
递推推导
当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:
⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;
⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
综上得到 D(n) = (n-1) [D(n-2) + D(n-1)]
通项推导
正整数1, 2, 3, ……, n的全排列有 n! 种,其中第k位是k的排列有 (n-1)! 种;
当k分别取1, 2, 3, ……, n时,共有n*(n-1)!种排列是至少放对了一个的,由于所求的是错排的种数,所以应当减去这些排列; (这时n!-n!=0,排列被减完了)
但是此时把同时有两个数不错排的排列多排除了一次,应补上n!/2! [(n-2)!*C(n,2)=n!/2!];
在补上时,把同时有三个数不错排的排列多补上了一次,应排除n!/3!; ……;
继续这一过程,得到错排的排列种数为
D(n) = n! - n!/1! + n!/2! - n!/3! + … + (-1)^n*n!/n! = ∑(k=2~n) (-1)^k * n! / k!
即D(n) = n! [1/0! - 1/1! + 1/2! - 1/3! + 1/4! + ... + (-1)^n/n!].
板子题https://acm.hdu.edu.cn/showproblem.php?pid=2048
斐波那契数列
性质
不用背
卡兰特数(重点)
https://www.luogu.com.cn/problem/P1044
例题
https://www.luogu.com.cn/problem/P1157(递归)
https://www.luogu.com.cn/problem/P7566(排列组合)
https://www.luogu.com.cn/problem/P3197(容斥)