错排问题及其推广小结
错排问题最早被尼古拉·伯努利和欧拉研究,因此历史上也称为伯努利-欧拉的装错信封的问题。
问题1:
把n个元素放入n个编号位置,其中第k号元素不能放在第k号位置的所有情况有多少种?
n = 1; f(1) = 0;
n = 2; f(2) = 1;
n >= 3; f(n) = (n-1)*(f(n-1)+f(n-2));
n为1和2的情况很好求,对于n大于3的情况,我们可以这样理解:
a:我们可以这样理解,对第n个元素,如果是(n-1)个元素原本符合要求,那么第n个元素和前(n-1)个元素都交换一次, 这是一种情况,为(n-1)*f(n-1);
b:也可以是在前(n-1)个元素中有一个元素不是错排的,即对第k元素的排列还是在第k个位置上,这时只要把k和n交换也满足了条件,这是第二种情况,为(n-1)*f(n-2);
所以:f(n) = (n-1)*(f(n-1)+f(n-2));
Tips:f(n)的通项公式为:f(n) = n![1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!] ;
推广1:
k*n个人,每组k个人,共n组,坐到n行k列共n*k个位置中,但若第i(i=1,2......n)组不能坐到第i(i=1,2......n)行中(组内成员可换位置).问:共有几种不同的坐法?
n = 1; f(1) = 0;
n = 2; f(2) = A(k)*A(k); //A(k)函数表示k个元素的全排列数
n >=3; f(n) = A(k)*(n-1)*(f(n-1)+A(k)*f(n-2));
n为1时:第一组成员不能坐在第一行中,f(1)=0;
n为2时:第一组成员坐第二行,第二组成员坐第一行,f(2)=A(k)*A(k);
n>=3时:
a:对于第n列元素,如果前(n-1)列元素原本符合要求,那么第n列元素和前(n-1)列元素都交换一次,这种情况为A(k)*(n-1)*f(n-1);
b:也可以是在前(n-1)列元素中有一列元素不是错排的,即对第k列元素的排列还是在第k列位置上,这时只要把第k列和第n列交换也满足条件,这种情况为A(k)*A(k)*(n-1)*f(n-2);
所以:f(n) = A(k)*(n-1)*(f(n-1)+A(k)*f(n-2));
推广2:
k*n个人,每组k个人,共n组,坐到n行k列共k*n个位置中,但若第i(i=1,2......n)组不能坐到第i(i=1,2......n)行中,组内成员可换位置,但每组内第j人不能坐到第j列.问:共有几种不同的坐法?
n = 1; f(1) = 0;
n = 2; f(2) = D(k)*D(k); //D(k)函数表示k个元素的全错排列数
n >=3; f(n) = D(k)*(n-1)*(f(n-1)+D(k)*f(n-2));
证明略~
推广3:
编号为a11,a12,...a1k,......,an1,an2,...ank的n*k个人(每组k个人,共n组),坐到编号为b11,b12,...b1k,......bn1,bn2,......bnk的n*k个位置中(共n行k列), 但编号为aij的人不能坐到编号为aij的位置中,问:共有几种不同的坐法?
Tips:此问题实际上就是n*k个数的错排问题。
t = n*k;
t = 1; f(1) = 0;
t = 2; f(2) = 1;
t >=3; f(t) = (n-1)*(f(t-1)+f(t-2));