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  阅读(88)  评论(0)    收藏  举报

编辑推荐:
· 通过抓包,深入揭秘MCP协议底层通信
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
阅读排行:
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 还在手写JSON调教大模型?.NET 9有新玩法
· 为大模型 MCP Code Interpreter 而生:C# Runner 开源发布
· 面试时该如何做好自我介绍呢?附带介绍样板示例!!!
· JavaScript 编年史:探索前端界巨变的幕后推手
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示