排列
从n个不同元素中,取
r(1<=r<=n)
r
(
1
<=
r
<=
n
)
个,按一定顺序排列,则排列数记为
A(n,r)=n!(n−r)!
A
(
n
,
r
)
=
n
!
(
n
−
r
)
!
证明:略
圆排列
(即通过转动,可变为同一个排列的排列称为同一个圆排列)
n个人围成一圈的方案数记作
Q(n,n)
Q
(
n
,
n
)
,因为圆排列从任意一个位置断开为一个线排列,可得
Q(n,n)∗n=A(n,n)
Q
(
n
,
n
)
∗
n
=
A
(
n
,
n
)
推出
Q(n,n)=A(n,n)n=(n−1)!
Q
(
n
,
n
)
=
A
(
n
,
n
)
n
=
(
n
−
1
)
!
由此可得部分圆排列,(从n个人中选r个围成一圈)
Q(n,r)=A(n,r)r=n!r(n−r)!
Q
(
n
,
r
)
=
A
(
n
,
r
)
r
=
n
!
r
(
n
−
r
)
!
重复排列
有限个数
假设有k种n个球,每种球的个数为 a1,a2,…,ak a 1 , a 2 , … , a k ,则这n个球的全排列为 n!a1!⋅a2!…ak! n ! a 1 ! ⋅ a 2 ! … a k !
证明:记集合
A={a1∗b1,a2∗b2,…,ak∗bk}
A
=
{
a
1
∗
b
1
,
a
2
∗
b
2
,
…
,
a
k
∗
b
k
}
,
记集合
B={b11,b21,…,ba11,b12,b22,…,ba22,…}
B
=
{
b
1
1
,
b
1
2
,
…
,
b
1
a
1
,
b
2
1
,
b
2
2
,
…
,
b
2
a
2
,
…
}
则集合B的全排列为
n!
n
!
,又因为对于每一个A集合的排列,都可以产生
a1!⋅a2!⋅⋯⋅ak!
a
1
!
⋅
a
2
!
⋅
⋯
⋅
a
k
!
个B集合中的排列,所以可得A集合的全排列等于
n!a1!⋅a2!…ak!
n
!
a
1
!
⋅
a
2
!
…
a
k
!
无限个数
因为每一次都有k种选择,一共要选n个球,那么方案数为 nk n k
项链排列
项链排列,在圆排列的基础上多一个翻转.(即经过转动,翻转,变为同一个排列的排列称为同一个项链排列)
从n个元素中选r个,项链排列的个数为
A(n,r)2∗r
A
(
n
,
r
)
2
∗
r
严谨证明参照Pólya定理
本文感性认知,圆排列的个数为
n!r(n−r)!
n
!
r
(
n
−
r
)
!
,因为项链排列只是在圆排列的基础上多了一个翻转操作,那么每一个项链排列都会产生2个圆排列,所以要多除以2.
错排问题
如 {a1,a2,…,an} { a 1 , a 2 , … , a n } 为 {1,2,…,n} { 1 , 2 , … , n } 的一排列,若所有的i中,皆有 ai≠i a i ≠ i ,则称这种排列为错排,记为 Dn D n
通项:
Dn=n!(1−11!+12!−13!+⋯+(−1)nn!)
D
n
=
n
!
(
1
−
1
1
!
+
1
2
!
−
1
3
!
+
⋯
+
(
−
1
)
n
n
!
)
证明:利用容斥原理,n个数的全排列为
n!
n
!
减去有一个数位置不动的排列为
Cn1⋅(n−1)!
C
1
n
⋅
(
n
−
1
)
!
加上有两个数位置不动的排列为
Cn2⋅(n−2)!
C
2
n
⋅
(
n
−
2
)
!
….
所以
Dn=n!−Cn1⋅(n−1)!+Cn2⋅(n−2)!−⋯+(−1)n⋅Cnn⋅(n−n)!
D
n
=
n
!
−
C
1
n
⋅
(
n
−
1
)
!
+
C
2
n
⋅
(
n
−
2
)
!
−
⋯
+
(
−
1
)
n
⋅
C
n
n
⋅
(
n
−
n
)
!
=n!−n!1!+n!2!−⋯+(−1)n⋅n!n!
=
n
!
−
n
!
1
!
+
n
!
2
!
−
⋯
+
(
−
1
)
n
⋅
n
!
n
!
递推公式:
Dn=(n−1)(Dn−2+Dn−1)(n≥3)
D
n
=
(
n
−
1
)
(
D
n
−
2
+
D
n
−
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} { a 1 , a 2 , … , a n } 为 {1,2,…,n} { 1 , 2 , … , n } 的一排列,计算没有出现 (1,2),(2,3)…(n−1,n) ( 1 , 2 ) , ( 2 , 3 ) … ( n − 1 , n ) ,即相对位置有限制的排列数,记为 Qn Q n
通项:
Qn=n!−Cn−11⋅(n−1)!+Cn−12⋅(n−2)!−⋯+(−1)n−1⋅Cn−1n−1⋅1!
Q
n
=
n
!
−
C
1
n
−
1
⋅
(
n
−
1
)
!
+
C
2
n
−
1
⋅
(
n
−
2
)
!
−
⋯
+
(
−
1
)
n
−
1
⋅
C
n
−
1
n
−
1
⋅
1
!
其实证明过程依旧是利用容斥原理,和上面的错排类似,只不过因为要求不能出现相邻的元素,所以是从
n−1
n
−
1
对中选择而已.
递推:
Qn=Dn−1+Dn−2
Q
n
=
D
n
−
1
+
D
n
−
2
证明:
Qn=n!−Cn−11⋅(n−1)!+Cn−12⋅(n−2)!−⋯+(−1)n−1⋅Cn−1n−1⋅1!
Q
n
=
n
!
−
C
1
n
−
1
⋅
(
n
−
1
)
!
+
C
2
n
−
1
⋅
(
n
−
2
)
!
−
⋯
+
(
−
1
)
n
−
1
⋅
C
n
−
1
n
−
1
⋅
1
!
=(n−1)!⟮n−n−11!+n−22!−⋯+(−1)(n−1)(n−1)!⟯
=
(
n
−
1
)
!
⟮
n
−
n
−
1
1
!
+
n
−
2
2
!
−
⋯
+
(
−
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
)
!
⟮
n
−
n
1
!
+
n
2
!
−
⋯
+
(
−
1
)
(
n
−
1
)
n
(
n
−
1
)
!
+
(
−
1
)
n
n
n
!
⟯
+
(
n
−
1
)
!
⟮
1
1
!
+
2
2
!
−
⋯
+
(
−
1
)
(
n
−
2
)
(
n
−
1
)
(
n
−
1
)
!
+
(
−
1
)
(
n
−
1
)
n
n
!
⟯
=n!⟮1−11!+12!−13!+⋯+(−1)nn!⟯+(n−1)!⟮1−11!+12!−13!+⋯+(−1)(n−1)(n−1)!⟯
=
n
!
⟮
1
−
1
1
!
+
1
2
!
−
1
3
!
+
⋯
+
(
−
1
)
n
n
!
⟯
+
(
n
−
1
)
!
⟮
1
−
1
1
!
+
1
2
!
−
1
3
!
+
⋯
+
(
−
1
)
(
n
−
1
)
(
n
−
1
)
!
⟯
=Dn−1+Dn−2
=
D
n
−
1
+
D
n
−
2
相关题目
T1:HDU-1465(题目难度:★☆☆☆☆)
错排应用
T2:洛谷4517(SDOI2016)(题目难度:★★☆☆☆)
因为是要求有且仅有m个数稳定,也就是说剩下(n-m)个数不能在自己原来的位置上,即错排.然后乘上组合数即可.
Code
T3:ZOJ-1202(题目难度:★★☆☆☆)
先将钻石全排列,然后因为箱子内部不区分,除以箱子容量的阶乘,又因为同样容量的箱子不区分,除以相同容量箱子的个数.
Code
生成排列
注:这个东西我觉得没有什么用,因为stl自带next_permutation.所以我只是在引用了《组合数学》上的一个生成排列的算法.
参考资料
1.OI wiki
2.《组合数学》