hdu3625-第一类斯特林数
来源:互联网 发布:天子星餐饮软件 编辑:程序博客网 时间:2024/04/28 17:56
第一类斯特林数S(n, m)是将n个物品分成m个非空循环排列的方法数
对于第n个物品,可以单独构成一个非空循环排列,这样前n-1个物品构成m-1个非空循环排列,方法数是 S(n - 1, m - 1),
也可以前n - 1个物品构成m个非空循环排列,第n个物品插入第i个物品的左边,方法数是 (n - 1) * S(n - 1, m),
所以递推公式为S(n, m) = S(n - 1, m - 1) + (n - 1) * S(n - 1, m),S(i, 0) = 0, S(i, i) = 1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625
题意:有n个房间都被锁上了,开门的钥匙被放在房间里面(每个房间一个),第一个房间的门不能被破坏,求最多破坏k个门,有可能将所有房间都打开的概率。
因为第一个房间的门不能被破坏,所以第一个房间不能单独成一个非空循环排列,所以破坏i个门打开所有房间的方法数为S(n, i) - S(n - 1, i - 1),
求出破坏1,2,3,...,k个门的方法数之和,求出n的全排列,两者比值即为所求。
代码:
# include <iostream># include <algorithm># include <cstdio># include <cstring>using namespace std;typedef long long ll;const int maxn = 20 + 1;int n, k;ll S[maxn][maxn];ll A[maxn][maxn];void init() { memset(S, 0, sizeof S); S[1][1] = 1; for (int i = 2; i < maxn; ++i) { 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 < maxn; ++i) { A[i][1] = i; for (int j = 2; j <= i; ++j) { A[i][j] = A[i][j - 1] * (i - j + 1); } }}int main(void){ init(); int T; scanf("%d", &T); while (T-- && scanf("%d %d", &n, &k)) { ll cnt2 = A[n][n]; ll cnt1 = 0; for (int i = 1; i <= k; ++i) { cnt1 += S[n][i] - S[n - 1][i - 1]; } printf("%.4f\n", cnt1 * 1.0 / cnt2); } return 0;}
阅读全文
0 0
- HDU3625 第一类斯特林数
- hdu3625-第一类斯特林数
- 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms
- hdu3625 Examining the Rooms && hdu4372 Count the Buildings(第一类斯特林数)
- HDU4372(第一类斯特林数)
- HDU4372(第一类斯特林数)
- 第一类斯特林数 hdu4372
- hdu4372 第一类斯特林数
- hdu 3625 第一类斯特林数
- hdu 4372 第一类斯特林数
- 第一类斯特林数学习小记
- 第一类斯特林数 hdu 3625
- zoj3344 第一类斯特林数+java大数
- HDU4372Count the Buildings(第一类斯特林数)
- 【第一类斯特林数】自然数幂和
- 【第一类斯特林数】HDU_3625_Examining the Rooms
- 【第一类斯特林数】HDU_4372_ Count the Buildings
- 第一类斯特林数和第二类斯特林数
- 软考上午题难点5分钟攻克系列(六)
- 信道分解
- 频道管理
- 哈哈日语 学日语 入门难?那是你用错了方法!
- RDO、SAD、SATD、λ相关概念
- hdu3625-第一类斯特林数
- 如何调整深度学习算法模型的参数以及模型融合
- Hdu6146 Pokémon GO(2017百度之星程序设计大赛
- 同余定理
- 0819 T1 笔记
- 杭电1241——Oil Deposits(深搜dfs)
- [leetcode]46. Permutations@Java解题报告
- 曲线点抽稀算法-Python实现
- viewpager的封装类Banner