链接:
http://acm.split.hdu.edu.cn/showproblem.php?pid=3625
题意:
有N个房间,每个房间里有一把钥匙,钥匙随机分配。如果手中有对应的钥匙,就可以开门,如果没有钥匙就只能选择破门而入拿钥匙,
第一个房间不允许破门,给定最多破门次数K,求能进入所有房间的概率。
题解:
第一类斯特林数
代码:
31 ll stir[25][25]; 32 ll jie[25]; 33 34 void init() { 35 stir[1][0] = 0; 36 stir[1][1] = 1; 37 rep(i, 2, 21) rep(j, 1, i + 1) 38 stir[i][j] = stir[i - 1][j - 1] + (i - 1)*stir[i - 1][j]; 39 jie[1] = 1; 40 rep(i, 2, 21) jie[i] = jie[i - 1] * i; 41 } 42 43 int main() { 44 //ios::sync_with_stdio(false), cin.tie(0); 45 init(); 46 int T; 47 cin >> T; 48 while (T--) { 49 int n, k; 50 cin >> n >> k; 51 ll ans = 0; 52 rep(i, 1, k + 1) ans += stir[n][i] - stir[n - 1][i - 1]; 53 printf("%.4f ", 1.0*ans / jie[n]); 54 } 55 return 0; 56 }