题目描述:
事情是这样的——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 来保存,不然会溢出