HDU 2048--错排
http://acm.hdu.edu.cn/showproblem.php?pid=2048
中文题,不解释。。
错排证明:
递推数列法
对于排列数较多的情况,难以采用枚举法。这时可以用递归思想推导错排数的递推公式。
显然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) [1]
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 __int64 f[100],sum; 5 int main() 6 { 7 int t,n; 8 f[1]=0;f[2]=1; 9 for(int i=3;i<22;i++) 10 f[i]=(i-1)*(f[i-1]+f[i-2]); 11 while(~scanf("%d",&t)) 12 { 13 while(t--) 14 { 15 sum=1; 16 scanf("%d",&n); 17 for(i=1;i<=n;i++) 18 sum*=i; 19 printf("%.2lf%%\n",f[n]*100.0/sum); 20 } 21 } 22 return 0; 23 }
posted on 2013-02-06 21:56 acoderworld 阅读(92) 评论(0) 收藏 举报
浙公网安备 33010602011771号