题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2048
题解:
n个人抽取的总情况为n!,所有人都没抽到自己名字的情况即错排数,存放在D[n]里,可用递推的方法求错排数D[n]。
显然D1=0,D2=1。当n≥3时,不妨设n排在了第k位,其中k≠n,也就是1≤k≤n-1。那么我们现在考虑第n位的情况。
- 当k排在第n位时,除了n和k以外还有n-2个数,其错排数为Dn-2。
- 当k不排在第n位时,那么将第n位重新考虑成一个新的“第k位”,这时的包括k在内的剩下n-1个数的每一种错排,都等价于只有n-1个数时的错排(只是其中的第k位会换成第n位)。其错排数为Dn-1。
所以当n排在第k位时共有Dn-2+Dn-1种错排方法,又k有从1到n-1共n-1种取法,我们可以得到:
- Dn=(n-1)(Dn-1+Dn-2) [2]
- 概率就是D[n]*100.0/n!%
-
- 代码:
-
#include<stdio.h> int main() { int T; _int64 D[21];//存放错排数 D[1]=0; D[2]=1; int i,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=3;i<=n;i++) { D[i]=(i-1)*(D[i-1]+D[i-2]); } double s=1.0; for(i=1;i<=n;i++) { s*=i; } printf("%.2lf%%\n",D[n]*100.0/s); } return 0; }