题目大概:


有n封书信,全部发错了地方,问有多少种错误方式。


思路:


a[n]为n封书信的错误方式。


按递推的想法,先是前面的书信已经发好。


第n封书信可以有两种情况:


1。。这封书信送到了第k个应该送的地方,而第k封书信送到了第n封书信应该送的地方。其他书信不变,并且k有n-1个,有(n-1)*a[n-1]种。


所以a[n]=(n-1)*(a[n-1]+a[n-2])。



感想:



这个错排公式有种熟悉的感觉,高中的排列组合题可能做过这种错排题。



代码:



#include <iostream>

using namespace std;

int main()
{int n;


while(cin>>n)
{long int a[21]={0};
a[1]=0;
a[2]=1;
for(int i=3;i<=20;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
}



cout<<a[n]<<endl;
}

return 0;
}