版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34283998/article/details/82426978
排列
从n个不同元素中,取
r(1<=r<=n)
个,按一定顺序排列,则排列数记为
A(n,r)=n!(n−r)!
证明:略
圆排列
(即通过转动,可变为同一个排列的排列称为同一个圆排列)
n个人围成一圈的方案数记作
Q(n,n)
,因为圆排列从任意一个位置断开为一个线排列,可得
Q(n,n)∗n=A(n,n)
推出
Q(n,n)=A(n,n)n=(n−1)!
由此可得部分圆排列,(从n个人中选r个围成一圈)
Q(n,r)=A(n,r)r=n!r(n−r)!
重复排列
有限个数
假设有k种n个球,每种球的个数为
a1,a2,…,ak
,则这n个球的全排列为
n!a1!⋅a2!…ak!
证明:记集合
A={a1∗b1,a2∗b2,…,ak∗bk}
,
记集合
B={b11,b21,…,ba11,b12,b22,…,ba22,…}
则集合B的全排列为
n!
,又因为对于每一个A集合的排列,都可以产生
a1!⋅a2!⋅⋯⋅ak!
个B集合中的排列,所以可得A集合的全排列等于
n!a1!⋅a2!…ak!
无限个数
因为每一次都有k种选择,一共要选n个球,那么方案数为
nk
项链排列
项链排列,在圆排列的基础上多一个翻转.(即经过转动,翻转,变为同一个排列的排列称为同一个项链排列)
从n个元素中选r个,项链排列的个数为
A(n,r)2∗r
严谨证明参照Pólya定理
本文感性认知,圆排列的个数为
n!r(n−r)!
,因为项链排列只是在圆排列的基础上多了一个翻转操作,那么每一个项链排列都会产生2个圆排列,所以要多除以2.
错排问题
如
{a1,a2,…,an}
为
{1,2,…,n}
的一排列,若所有的i中,皆有
ai≠i
,则称这种排列为错排,记为
Dn
通项:
Dn=n!(1−11!+12!−13!+⋯+(−1)nn!)
证明:利用容斥原理,n个数的全排列为
n!
减去有一个数位置不动的排列为
Cn1⋅(n−1)!
加上有两个数位置不动的排列为
Cn2⋅(n−2)!
….
所以
Dn=n!−Cn1⋅(n−1)!+Cn2⋅(n−2)!−⋯+(−1)n⋅Cnn⋅(n−n)!
=n!−n!1!+n!2!−⋯+(−1)n⋅n!n!
递推公式:
Dn=(n−1)(Dn−2+Dn−1)(n≥3)
证明:(引用来自OI wiki上的证明)
胸口贴着编号为 1,2,⋯,n的 n个球员分别住在编号为 1,2,⋯,n的 n个房间里面。现规定每个人住一个房间,自己的编号不能和房间的编号一样。
这就是错排问题。当 n=3时,只能为 312 或 231 这两种。
那么错排问题的解题思路是什么呢?我们以第二个问题为例: 递推还是王道!!!
刚开始所有球员都住在和自己编号一样的房间里面。然后错排开始了,第 n个球员从第 n个房间出来。
第一种情况:
n想和 i(1≤i≤n−1)其中任何一个球员换房间,其他 n−2个人换房间的事情,他们就不管了。其他n−2个球员的的错排数为 d[n−2],n 可以和前面 1∼n−1对换,所以有 n−1个 d[n−2]。
第二种情况:
n想和 i(1≤i≤n−1)其中任何一个球员换房间,但是 n只想 i住在第 n个房间,而 n不想住第 i个房间。
可能你会这样想:那么 n可以让 j住在第 i号房间里面,然后 n住在房间 j。抱歉,j(1≤j≤n−1,j≠i)生气 n为什么一开始就去找 i不直接来找 j。没办法,n把自己胸口的编码n换成了i,他假装自己是 i,然后错排 1∼n−1(也就是 d[n−2])的时候参与进去,这样自己就不会呆在第i号房间了。所以有 n−1个 d[n−1]。
(来源:OI wiki)
有限制的排列
如
{a1,a2,…,an}
为
{1,2,…,n}
的一排列,计算没有出现
(1,2),(2,3)…(n−1,n)
,即相对位置有限制的排列数,记为
Qn
通项:
Qn=n!−Cn−11⋅(n−1)!+Cn−12⋅(n−2)!−⋯+(−1)n−1⋅Cn−1n−1⋅1!
其实证明过程依旧是利用容斥原理,和上面的错排类似,只不过因为要求不能出现相邻的元素,所以是从
n−1
对中选择而已.
递推:
Qn=Dn−1+Dn−2
证明:
Qn=n!−Cn−11⋅(n−1)!+Cn−12⋅(n−2)!−⋯+(−1)n−1⋅Cn−1n−1⋅1!
=(n−1)!⟮n−n−11!+n−22!−⋯+(−1)(n−1)(n−1)!⟯
=(n−1)!⟮n−n1!+n2!−⋯+(−1)(n−1) n(n−1)!+(−1)nnn!⟯+(n−1)!⟮11!+22!−⋯+(−1)(n−2) (n−1)(n−1)!+(−1)(n−1)nn!⟯
=n!⟮1−11!+12!−13!+⋯+(−1)nn!⟯+(n−1)!⟮1−11!+12!−13!+⋯+(−1)(n−1)(n−1)!⟯
=Dn−1+Dn−2
相关题目
T1:HDU-1465(题目难度:★☆☆☆☆)
错排应用
T2:洛谷4517(SDOI2016)(题目难度:★★☆☆☆)
因为是要求有且仅有m个数稳定,也就是说剩下(n-m)个数不能在自己原来的位置上,即错排.然后乘上组合数即可.
Code
T3:ZOJ-1202(题目难度:★★☆☆☆)
先将钻石全排列,然后因为箱子内部不区分,除以箱子容量的阶乘,又因为同样容量的箱子不区分,除以相同容量箱子的个数.
Code
生成排列
注:这个东西我觉得没有什么用,因为stl自带next_permutation.所以我只是在引用了《组合数学》上的一个生成排列的算法.
参考资料
1.OI wiki
2.《组合数学》