题目描述:

事情是这样的——HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!

现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?

全错排公式的使用:

推导如下

记n个数的全错排数位D(n)

对于n个数,任取一个数k,将其摆放在除自己外的任意位置,有n-1种可能,而原位置的数(记为j)可以选择放在k原来的位置,此时有D(n-1)种选择,

它也可以放在除自己和k的位置,此时有D(n-2)种选择

故有D(n)=(n-1)*(D(n-1)+D(n-2);

#include<iostream>
using namespace std;
int main()
{
    long long a[21];
    a[1]=0;
    a[2]=1;
    a[3]=2;
    for(int i=4; i<=20; i++){
        a[i]=(i-1)*(a[i-1]+a[i-2]);
    }
    int n;
    while(cin >> n){
        cout << a[n] << endl;
    }
    return 0;
 } 

另外,数组需要long long int 来保存,不然会溢出