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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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个球,每种球的个数为 a 1 , a 2 , , a k ,则这n个球的全排列为 n ! a 1 ! a 2 ! a k !

证明:记集合 A = { a 1 b 1 , a 2 b 2 , , a k b k } ,
记集合 B = { b 1 1 , b 1 2 , , b 1 a 1 , b 2 1 , b 2 2 , , b 2 a 2 , }
则集合B的全排列为 n ! ,又因为对于每一个A集合的排列,都可以产生 a 1 ! a 2 ! a k ! 个B集合中的排列,所以可得A集合的全排列等于 n ! a 1 ! a 2 ! a k !

无限个数

因为每一次都有k种选择,一共要选n个球,那么方案数为 n k

项链排列

项链排列,在圆排列的基础上多一个翻转.(即经过转动,翻转,变为同一个排列的排列称为同一个项链排列)
从n个元素中选r个,项链排列的个数为 A ( n , r ) 2 r

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

错排问题

{ a 1 , a 2 , , a n } { 1 , 2 , , n } 的一排列,若所有的i中,皆有 a i i ,则称这种排列为错排,记为 D n

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

递推公式: 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)

有限制的排列

{ a 1 , a 2 , , a n } { 1 , 2 , , n } 的一排列,计算没有出现 ( 1 , 2 ) , ( 2 , 3 ) ( n 1 , n ) ,即相对位置有限制的排列数,记为 Q n

通项:
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 对中选择而已.

递推:
Q n = D n 1 + D n 2
证明:
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 1 1 ! + n 2 2 ! + ( 1 ) ( n 1 ) ( n 1 ) !
= ( 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 1 1 ! + 1 2 ! 1 3 ! + + ( 1 ) n n ! + ( n 1 ) ! 1 1 1 ! + 1 2 ! 1 3 ! + + ( 1 ) ( n 1 ) ( n 1 ) !
= 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.《组合数学》

猜你喜欢

转载自blog.csdn.net/qq_34283998/article/details/82426978
今日推荐