@(HDU)[Stirling數]

Problem Description

A murder happened in the hotel. As the best detective in the town, you should examine all the N rooms of the hotel immediately. However, all the doors of the rooms are locked, and the keys are just locked in the rooms, what a trap! You know that there is exactly one key in each room, and all the possible distributions are of equal possibility. For example, if N = 3, there are 6 possible distributions, the possibility of each is 1/6. For convenience, we number the rooms from 1 to N, and the key for Room 1 is numbered Key 1, the key for Room 2 is Key 2, etc.

To examine all the rooms, you have to destroy some doors by force. But you don’t want to destroy too many, so you take the following strategy: At first, you have no keys in hand, so you randomly destroy a locked door, get into the room, examine it and fetch the key in it. Then maybe you can open another room with the new key, examine it and get the second key. Repeat this until you can’t open any new rooms. If there are still rooms un-examined, you have to randomly pick another unopened door to destroy by force, then repeat the procedure above, until all the rooms are examined.

Now you are only allowed to destroy at most K doors by force. What’s more, there lives a Very Important Person in Room 1. You are not allowed to destroy the doors of Room 1, that is, the only way to examine Room 1 is opening it with the corresponding key. You want to know what is the possibility of that you can examine all the rooms finally.

Input

The first line of the input contains an integer T (T ≤ 200), indicating the number of test cases. Then T cases follow. Each case contains a line with two numbers N and K. (1 < N ≤ 20, 1 ≤ K < N)

Output

Output one line for each case, indicating the corresponding possibility. Four digits after decimal point are preserved by rounding.

Sample Input

3
3 1
3 2
4 2

Sample Output

0.3333
0.6667
0.6250

Hint

Sample Explanation

When N = 3, there are 6 possible distributions of keys:

	Room 1	Room 2	Room 3	Destroy Times
1 Key 1 Key 2 Key 3 Impossible
2 Key 1 Key 3 Key 2 Impossible
3 Key 2 Key 1 Key 3 Two
4 Key 3 Key 2 Key 1 Two
5 Key 2 Key 3 Key 1 One
6 Key 3 Key 1 Key 2 One

In the first two distributions, because Key 1 is locked in Room 1 itself and you can’t destroy Room 1, it is impossible to open Room 1.

In the third and forth distributions, you have to destroy Room 2 and 3 both. In the last two distributions, you only need to destroy one of Room 2 or Room

Source

2010 Asia Regional Tianjin Site —— Online Contest

Solution

題意:

n个房间对应n把钥匙, 每个房间的钥匙随机放在某个房间内, 概率相同。

有K次炸门的机会,求能进入所有房间的概率

一号门不给你炸

--by ZWL

實際上這題就是第一類Stirling數的模板應用.

不妨設\(key_i\)表示第\(i\)個房間內放的鑰匙是哪把, 則對於這樣一組\(i\)和\(key_i\), 可看作在一個有向圖中, 點\(i\)向點\(key_i\)連出一條有向邊. 當對這個有向圖連邊完畢后, 就會發現, 每個點的出度和入度都為\(1\). 連邊組成一個或多個環. 而在一個環中, 只要有一個房間可以通過任何方式進入, 則其他房間都可以進入了.

由於可以炸開門的次數為\(k\), 因此要求這個圖中環的個數不超過\(k\). 同時由於\(1\)號房間的門不能被炸開, 因此\(1\)不能單獨在一個環中. 所以滿足條件的方案數為: $$qua = \sum_{i = 1}^n \left( \left[ \begin{array}{} n \ i \end{array}{} \right] - \left[ \begin{array}{} n - 1 \ i - 1 \end{array}{} \right] \right)$$

代碼附上:

#include<cstdio>
#include<cctype>
using namespace std; inline int read()
{
int x = 0, flag = 1;
char c;
while(! isdigit(c = getchar()))
if(c == '-')
flag *= - 1;
while(isdigit(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
} const int N = 1 << 5; long long f[N][N];
long long fac[N]; int main()
{
fac[0] = 1;
for(int i = 1; i < N; i ++)
fac[i] = fac[i - 1] * i; f[0][0] = 1; for(int i = 1; i < N; i ++)
f[0][i] = 0; for(int i = 1; i < N; i ++)
{
f[i][0] = (long long)0; for(int j = 1; j <= i; j ++)
f[i][j] = f[i - 1][j - 1] + (long long)(i - 1) * f[i - 1][j];
} int T = read(); for(; T --; )
{
int n = read(), k = read(); long long qua = 0; for(int i = 1; i <= k; i ++)
qua += f[n][i] - f[n - 1][i - 1]; printf("%.4lf\n", (double)qua / fac[n]);
}
}

HDU3625 Examining the Rooms的更多相关文章

  1. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. Examining the Rooms(dp,斯特灵数)

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. [HDU 3625]Examining the Rooms (第一类斯特林数)

    [HDU 3625]Examining the Rooms (第一类斯特林数) 题面 有n个房间,每个房间有一个钥匙,钥匙等概率的出现在n个房间内,每个房间中只会出现且仅出现一个钥匙.你能炸开门k次, ...

  4. hdu Examining the Rooms

    这道题的知识点第一次听说 ,就是应用斯特林数.题目的意思是给你房间数N,和最多能破门的个数,让你求能全部把房间打开的概率! a[i][j]=a[i-1][j-1]+(i-1)*a[i-1][j]; # ...

  5. HDU 3625 Examining the Rooms

    题目大意:有n个房间,n!个钥匙,在房间中,最多可以破k扇门,然后得到其中的钥匙,去开其它的门,但是第一扇门不可以破开,求可以打开所有门的概率. 题解:首先,建立这样的一个模型,题目相当于给出一个图, ...

  6. HDU 3625 Examining the Rooms:第一类stirling数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625 题意: 有n个房间,每个房间里放着一把钥匙,对应能开1到n号房间的门. 除了1号门,你可以踹开任 ...

  7. HDU 3625 Examining the Rooms【第一类斯特灵数】

    <题目链接> <转载于 >>> > 题目大意:有n个锁着的房间和对应n扇门的n把钥匙,每个房间内有一把钥匙.你可以破坏一扇门,取出其中的钥匙,然后用取出钥匙打 ...

  8. Examining the Rooms - 第一类斯特灵数

    ---恢复内容开始--- 2017-08-10 20:32:37 writer:pprp 题意如下: Recently in Teddy's hometown there is a competiti ...

  9. hdu 3625 Examining the Rooms——第一类斯特林数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 n^2 求斯特林数就行.要减去的就是1号钥匙在1号房间的方案,即 s[ n-1 ][ m-1] . ...

随机推荐

  1. sqlmanagementstudio2008下载地址

    http://big.wy119.com/sqlmanagementstudio2008_x86_chs.zip

  2. CentOS 7 配置OpenCL环境(安装NVIDIA cuda sdk、Cmake、Eclipse CDT)

    序 最近需要在Linux下进行一个OpenCL开发的项目,现将开发环境的配置过程记录如下,方便查阅. 完整的环境配置需要以下几个部分: 安装一个OpenCL实现,基于硬件,选择NVIDIA CUDA ...

  3. Ubuntu添加环境变量

    在 Ubuntu 系统中有两种设置环境变量 PATH 的方法.第一种适用于为单一用户设置 PATH,第二种是为全局设置 PATH. 第一种方法: 在用户主目录下有一个 .bashrc 文件,可以在此文 ...

  4. HDU 5238 Calculator 线段树 中国剩余定理

    题意: 给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算. 有一种查询操作:查询初始值为\(x\)的时候,最终运算结果模\(29393\)的值. 有一种修改操作:可以修改第\(p\)个运算的运算 ...

  5. luogu1501 [国家集训队]Tree II

    lct裸题 #include <iostream> #include <cstdio> using namespace std; typedef long long ll; i ...

  6. angularjs报错问题记录

    1.[$injector:unpr]:没有找到注入的东西    2.$compile:multidir:多指令编译错误.    3.[ng:areq]:重复定义了ng-controller.    4 ...

  7. STL学习笔记2--list

    List --- 双向列表 List是线性列表结构,数据查找需要一个接一个,不能直接得到元素地址,检索时间与目标元素的位置成正比.但是插入数据比较快,可以在任何位置插入数据或者删除数据.list特点是 ...

  8. MacOS常用软件推荐

    1.效率提升神器Alfred 可以搜索文件.应用.web搜索.词典等等 链接:https://pan.baidu.com/s/1igv4tuXkuMFOPT9E6Cc5Jg 密码:3o51 软件解压密 ...

  9. MySQL5.7从入门到精通 (视频教学版) 刘增杰 编著

    第1章 初识MySQL MySQL是一个开放源代码的数据库管理系统(DBMS),它是由MySQL AB公司开发.发布和支持的.MySQL是一个跨平台(Windows.Linux.UNIX.MacOS) ...

  10. 0014.Linux环境搭建 Python环境搭建

    -安装Linux-- 找了了老男孩19期的运维班安装视频,尼玛真心不想看书,文字枯燥的要死,还不如直接看视频进行安装... 可怜了我的C盘只有1GB了...绝对不能安装在C盘...那就安装在E盘吧,足 ...