错排:
当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 }