1. 程式人生 > >Examining the Rooms HDU - 3625(第一類斯特林數)

Examining the Rooms HDU - 3625(第一類斯特林數)

names can pre main bits ons pro div spa

Examining the Rooms

HDU - 3625

題意:n個房間,每個房間裏有一把鑰匙(等概率),每進到一個房間可以得到鑰匙去該鑰匙對應的房間,如果當前沒有鑰匙則可以破門而入(1號房間不能破門而入),不過最多破門而入k次,問成功進入n個房間的總概率。

明顯是求n個元素的i個環排列,i = 1,2,……,k.

不過要減去第一個房間自環的情況。

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int mod = 1e9+7;
 5 const int
maxn = 21; 6 ll s1[maxn][maxn], f[maxn]; 7 void init(){ 8 for(int i = 1; i < maxn; i++) { 9 s1[i][0] = 0; 10 s1[i][i] = 1; 11 for(int j = 1; j < i; j++) { 12 s1[i][j] = (s1[i-1][j-1] + (i-1)*s1[i-1][j]); 13 } 14 } 15 f[1] = 1; 16 for
(int i = 2; i <= 20; i++) { 17 f[i] = f[i-1] * i; 18 } 19 } 20 int main(){ 21 int n, k; 22 int t; 23 scanf("%d", &t); 24 init(); 25 while(t--) { 26 scanf("%d %d", &n, &k); 27 double ans=0; 28 for(int i = 1; i <= k; i++) ans += (s1[n][i] - s1[n-1
][i-1])*1.0 / f[n]; 29 printf("%.4lf\n", ans); 30 } 31 }
View Code

Examining the Rooms HDU - 3625(第一類斯特林數)