HDU 3625 Examining the Rooms

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.
 
参考:http://blog.csdn.net/queuelovestack/article/details/47970827
钥匙和门的关系是类似环状的,打开一个门之后,该环内的所有房间都可以进入,怎么说呢,就拿Hint里的#6来举例,Room1 Room2 Room3是在一个环当中的,假设我破坏了Room3,那么我取出Room3内的钥匙Key2就可以打开Room2,而Room2里有钥匙Key1,那我们又可以打开Room1。
第一类斯特林数可以求解把包含n个元素的集合分成k个环排列的方法数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <bitset>
using namespace std;
typedef long long LL;
#define MOD 1000000007
LL fac[25],s[25][25],n,k,T;
int main(){
  // freopen("test.in","r",stdin);
  cin >> T;
  fac[1] = 1; s[0][0] = 0; s[1][1] = 1; s[1][0] = 0;
  for (int i=2;i<=21;i++){
    fac[i] = fac[i-1] * i;
    s[i][0] = 0;
    for (int j=1;j<=i;j++){
      s[i][j] = s[i-1][j-1] + (i-1) * s[i-1][j];
    }
  }
  for (int i=1;i<=T;i++){
    cin >> n >> k;
    LL ans = 0;
    for (int j=1;j<=k;j++){
      ans += s[n][j] - s[n-1][j-1];
    }
    double anss = ans * 1.0;
    printf("%.4lf
",anss/fac[n]);
  }
  return 0;
}
View Code
原文地址:https://www.cnblogs.com/ToTOrz/p/7389630.html