题目大意:事情是这样的——HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!
现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?
题目解析:
1.首先这是一个错排的问题,我们先来推导一下公式。
2.先从信封2到n中,拿出信封k中的信,把信放在信封1的位置。有n-1种可能。
情况一:信封1中的信放在信封k中,即剩下的错排方式有D[n-2]种。
情况二:信封1中的信没有放在信封k中,即剩下的错排方式有D[n-1]种。
3.即可得到递推公式: D[n] = (n-1) * (D[n-1] + D[n-2])
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 int main() 3 { 4 __int64 d[50]; 5 int n; 6 d[1] = 0; 7 d[2] = 1; 8 for(int i = 3; i < 22; i++) 9 d[i] = (i-1) * (d[i-1] + d[i-2]); 10 while(scanf("%d" , &n) != EOF) 11 { 12 printf("%I64d\n" , d[n]); 13 } 14 return 0; 15 }