zrq495
www.zrq495.com

错排:

    当n个编号元素放在n个编号位置, 元素编号与位置编号各不对应的方法数用M(n)表示, 那么M(n-1)就表示n-1个编号元素放在n-1个编号位置, 各不对应的方法数, 其它类推.   

    第一步, 把第n个元素放在一个位置, 比如位置k,一共有n-1种方法;   

    第二步,放编号为k的元素,这时有两种情况.

        1,把它放到位置n,那么,对于剩下的n-2个元素,就有M(n-2)种方法;

        2,不把它放到位置n,这时,对于这n-2个元素,有M(n-1)种方法;   

    综上得到   

        M(n)=(n-1)[M(n-2)+M(n-1)]   

        特殊地,M(1)=0,M(2)=1

最小的几个错排数是:D1 = 0,D2 = 1,D3=2,D4 = 9,D5 = 44,D6 = 265,D7 = 1854。

代码:

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 long long int f[21];
 6 
 7 int main()
 8 {
 9     int n, i;
10     f[1]=0;
11     f[2]=1;
12     for (i=3; i<21; i++)
13         f[i]=(i-1)*(f[i-1]+f[i-2]);
14     while(cin >> n)
15     {
16         cout << f[n] << endl;
17     }
18     return 0;
19 }
posted on 2012-07-31 14:23  zrq495  阅读(163)  评论(0编辑  收藏  举报