2018NOIP知识梳理(四)——数论相关(三)

排列

从n个不同元素中,取 r(1<=r<=n) r ( 1 <= r <= n ) 个,按一定顺序排列,则排列数记为 A(n,r)=n!(nr)! 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=(n1)! Q ( n , n ) = A ( n , n ) n = ( n − 1 ) !
由此可得部分圆排列,(从n个人中选r个围成一圈)
Q(n,r)=A(n,r)r=n!r(nr)! 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={a1b1,a2b2,,akbk} 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)2r A ( n , r ) 2 ∗ r

严谨证明参照Pólya定理
本文感性认知,圆排列的个数为 n!r(nr)! n ! r ( n − r ) ! ,因为项链排列只是在圆排列的基础上多了一个翻转操作,那么每一个项链排列都会产生2个圆排列,所以要多除以2.

错排问题

{a1,a2,,an} { a 1 , a 2 , … , a n } {1,2,,n} { 1 , 2 , … , n } 的一排列,若所有的i中,皆有 aii a i ≠ i ,则称这种排列为错排,记为 Dn D n

通项: Dn=n!(111!+12!13!++(1)nn!) D n = n ! ( 1 − 1 1 ! + 1 2 ! − 1 3 ! + ⋯ + ( − 1 ) n n ! )
证明:利用容斥原理,n个数的全排列为 n! n !
减去有一个数位置不动的排列为 Cn1(n1)! C 1 n ⋅ ( n − 1 ) !
加上有两个数位置不动的排列为 Cn2(n2)! C 2 n ⋅ ( n − 2 ) !
….
所以 Dn=n!Cn1(n1)!+Cn2(n2)!+(1)nCnn(nn)! 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)nn!n! = n ! − n ! 1 ! + n ! 2 ! − ⋯ + ( − 1 ) n ⋅ n ! n !

递推公式: Dn=(n1)(Dn2+Dn1)(n3) 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)(n1,n) ( 1 , 2 ) , ( 2 , 3 ) … ( n − 1 , n ) ,即相对位置有限制的排列数,记为 Qn Q n

通项:
Qn=n!Cn11(n1)!+Cn12(n2)!+(1)n1Cn1n11! Q n = n ! − C 1 n − 1 ⋅ ( n − 1 ) ! + C 2 n − 1 ⋅ ( n − 2 ) ! − ⋯ + ( − 1 ) n − 1 ⋅ C n − 1 n − 1 ⋅ 1 !
其实证明过程依旧是利用容斥原理,和上面的错排类似,只不过因为要求不能出现相邻的元素,所以是从 n1 n − 1 对中选择而已.

递推:
Qn=Dn1+Dn2 Q n = D n − 1 + D n − 2
证明:
Qn=n!Cn11(n1)!+Cn12(n2)!+(1)n1Cn1n11! Q n = n ! − C 1 n − 1 ⋅ ( n − 1 ) ! + C 2 n − 1 ⋅ ( n − 2 ) ! − ⋯ + ( − 1 ) n − 1 ⋅ C n − 1 n − 1 ⋅ 1 !
=(n1)!nn11!+n22!+(1)(n1)(n1)! = ( n − 1 ) ! ⟮ n − n − 1 1 ! + n − 2 2 ! − ⋯ + ( − 1 ) ( n − 1 ) ( n − 1 ) ! ⟯
=(n1)!nn1!+n2!+(1)(n1) n(n1)!+(1)nnn!+(n1)!11!+22!+(1)(n2) (n1)(n1)!+(1)(n1)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!111!+12!13!++(1)nn!+(n1)!111!+12!13!++(1)(n1)(n1)! = 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 ) ! ⟯
=Dn1+Dn2 = 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.《组合数学》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值