上帝、神与神

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 26725    Accepted Submission(s): 11121

Problem Description
HDU 2006'10 ACM contest的颁奖晚会隆重開始了!

为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动。这个活动的详细要求是这种:



首先,全部參加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;

然后,待全部字条增加完成,每人从箱中取一个字条;

最后。假设取得的字条上写的就是自己的名字。那么“恭喜你。中奖了!”



大家能够想象一下当时的气氛之热烈。毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!只是。正如全部试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后居然没有一个人中奖!

我的神、上帝以及老天爷呀。怎么会这样呢?



只是。先不要激动。如今问题来了,你能计算一下发生这样的情况的概率吗?



不会算?难道你也想以悲剧结尾?!

 
Input
输入数据的第一行是一个整数C,表示測试实例的个数。然后是C 行数据。每行包括一个整数n(1<n<=20),表示參加抽奖的人数。


 
Output
对于每一个測试实例,请输出发生这样的情况的百分比,每一个实例的输出占一行, 结果保留两位小数(四舍五入),详细格式请參照sample output。


 
Sample Input
1
2
 
Sample Output
50.00%
 

N张字条的全部排列可能自然是A(N,N)= N!种排列方式

如今的问题就是N张字条的错排方式有几种。

分两种情况讨论

①:假设前面N-1个人拿的都不是自己的字条。即前N-1个人满足错排,那么仅仅要第N个人把自己的票与前面N-1个人中的随意一个交换,就能够满足N个人的错排。

这时有f(N-1)种方法。

②:假设前N-1个人不满足错排。而第N个人把自己的字条与当中一个人交换后恰好满足错排。

即在前面N-1人中,有N-2个人满足错排,有且仅仅有一个人拿的是自己的字条,而第N个人恰好与他做了交换,这时候就满足了错排。这时有f(n-2)种方法

对于①。由于前N-1个人中,每一个人都有机会与第N个人交换。所以有N-1种交换的可能。

对于②,由于前N-1个人中。每一个人都有机会拿着自己的字条。所以也有N-1种交换的可能。

 

所以得错排递推公式 

1.D[n] = (n-1)*(D[n-1]+D[n-2])

D(1)=0;D(2)=1;

因为计算n!和D[n]数字会很大,所以我们採用边做边除而不是先算D(n),再除n!的方法。

1.已知D[n]=(n-1)(D[n-1]+D[n-2]); 

2.f[n]=D[n]/n!;则有D[n]=n!*f[n]; 

3.代入可得f[n]=(n-1)(f[n-1]*(n-1)!+f[n-2]*(n-2)!)/n!; 

4.即得到错排概率公式f[n]=(f[n-1](n-1)+f[n-2])/n;

#include <stdio.h>
int main()
{
double a[22]={0,0,1};
__int64 i,n=3,m,t,j;
char d='%';
while(n<22)
{
a[n]=(n-1)*(a[n-1]+a[n-2]);
n++;
}
while(scanf("%d",&i)!=EOF)
{
while(i--)
{
t=1;
scanf("%d",&m);
for(j=1;j<=m;j++) t*=j;
printf("%.2lf%%\n",a[m]*100/t);
}
}
return 0;
}

明显超时。

ac代码;

#include <stdio.h>
int main()
{
double
a[22]={0,0,0.5};
int
i,n=3,m,t,j;
while(
n<22)
{

a[n]=(a[n-1]*(n-1)+a[n-2])/n;
n++;
}
while(
scanf("%d",&i)!=EOF)
{
while(
i--)
{

scanf("%d",&m);
printf("%.2lf%%\n",a[m]*100);
}
}
return
0;


版权声明:本文博主原创文章,博客,未经同意不得转载。

HDN2048(交错复发)的更多相关文章

  1. C#交错数组的用法

    class Program { static void Main(string[] args) { /* *交错数组,就是一个一维数组里面的每一项都是一个一维数组 *new交错数组的时候需要注意int ...

  2. C#交错数组

    交错数组本质上是一维数组只不过这个一维数组里的元素都是数组.因为该一维数组里面的元素可以是任何大小的数组所以定义时只能以这样的格式定义 ][]; 定义完后必须对该数组进行初始化后方可进行赋值等操作否则 ...

  3. JPG渐进 & PNG/PNG24 交错测试

    今天由同事说起,PS导出PNG时,有个选项"交错"是干啥的,想起这也是个问题,所以特意搞了个测试页面: 引用网上"交错-就是类似旧式电视的隔行扫描,让图片只花50%的时间 ...

  4. C#中的数组,多维数组和交错数组

    想研究一些面向对象的东西,也许是代码写得还不够多.感觉还不好,看那些教程,不是嫌太水就是太难看不懂.心情很是落寞 不过再怎样也要坚持每天发一篇博客. 这篇来说一下C#中的数组,多维数组,交错数组的一些 ...

  5. lintcode:交错正负数

    交错正负数 给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组. 注意事项 不需要保持正整数或者负整数原来的顺序. 样例 给出数组[-1, -2, -3, 4, 5, 6],重新排序之后 ...

  6. C#二维数组(矩形数组,交错数组)

    C# 支持一维数组.多维数组(矩形数组)和数组的数组(交错的数组) 1.多维数组 声明:string[,] names; 初始化:int[,] numbers = new int[3, 2] { {1 ...

  7. Ejection chain 与交错路

    相关文献: Rego, C. (1998). "A Subpath Ejection Method for the Vehicle Routing Problem." Manage ...

  8. IOS常用CGRect的交错,边缘,中心的检测

    转自:http://tsyouaschen.iteye.com/blog/1946957 判断给定的点是否被一个CGRect包含,可以用CGRectContainsPoint函数 BOOL conta ...

  9. Android 交错 GridView

    原文地址 本文演示在你的 Android 应用程序中显示交错 GridView(Staggered GridView ). 下载 Demo 交错 GridView 交错 GridView 只是具有不等 ...

随机推荐

  1. 多个UpdatePanel控件相互引发刷新的使用

    原文:多个UpdatePanel控件相互引发刷新的使用 ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果.其中的UpdatePanel就是设置页面中异 步局 ...

  2. hdu2412(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2412 题意:给定一棵关系树 , 从中选择一些点 , 使这些点均不存在亲子关系 , 最多能取多少个点 , ...

  3. 由sqlite在手机的内存位置,引起onCreate当运行总结

    转载请注明出处.谢谢:http://blog.csdn.net/harryweasley/article/details/46467495 我们都知道,android为了操作数据库,通常是继承SQLi ...

  4. 编写高效的JavaScript

    Web前端性能优化——编写高效的JavaScript   前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代.自Gmail网页版邮件服务的问世 ...

  5. Android学习路径(23)应用Fragment建立动态UI——Fragment之间的通信

    为了要重用Fragment的UI组件.你应该为它们每个都构建一个完整独立的,模块化的组件来定义他自身的布局和行为. 一旦你定义了这些可重用的Fragments.你能够通过activity关联它们同一时 ...

  6. hadoop-ha组态

    HADOOP HA组态 hadoop2.x的ha组态.这份文件是在那里的描述中hdfs与yarn的ha组态. 这份文件的假设是zk它已被安装并配置,事实上,任何安装. hdfs ha组态 首先.配置c ...

  7. iOSSingleton设计模式详细的说明教程

    iOS有很多的设计模式,当然,不管是什么语言有很多的设计模式.辛格尔顿是一种之一,辛格尔顿,它从字面上是一个单独的实例,首先,它是只有一个单一的,其次,它是一个实例.我们知道,在iOS用于开发Obje ...

  8. Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part II

    摘要:Part I探析GPUclient之间的同步问题,以及Chromium的GL扩展同步点机制的基本原理.本文将源码的角度剖析同步点(SyncPoint)机制的实现方式. 同步点机制的实现主要涉及到 ...

  9. HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 解读

    有一组数据是在客人到达和出发时间,问:多少把椅子的能力,以满足所有客人的需求,可以有一个地方坐下要求. 有些人甚至开始考虑暴力法,这些数据是少,其实这个问题很多数据, 暴力需求O(n*n)的时间效率, ...

  10. 【SICP读书笔记(三)】练习2.18 --- 表序列的reverse方法

    来自练习2.18 请定义出过程reverse,它以一个表为参数,返回的表中所包含的元素与参数表相同,但排列顺序与参数表相反: (reverse (list 1 4 9 16 25)) (25 16 9 ...