HDU 3625 第一类斯特林数
2017-05-29 16:22
288 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625
题意:
n个房间,房间里面放着钥匙,允许破门而入k个,拿到房间里面的钥匙后可以打开对应的门,但是1号门不能破门而入,求这样检查完所有房间,概率是多少?
分析:
钥匙随机放到房间,全排列有n!;
n个房间,破k个门进入,就是第一类斯特林数S(n,k);
但是,第一个门不能破门而入,就是要减去S(n-1,k-1);
然后求和SUM = S(n,i) {1<=i<=k}
概率就是 SUM / N!
View Code
题意:
n个房间,房间里面放着钥匙,允许破门而入k个,拿到房间里面的钥匙后可以打开对应的门,但是1号门不能破门而入,求这样检查完所有房间,概率是多少?
分析:
钥匙随机放到房间,全排列有n!;
n个房间,破k个门进入,就是第一类斯特林数S(n,k);
但是,第一个门不能破门而入,就是要减去S(n-1,k-1);
然后求和SUM = S(n,i) {1<=i<=k}
概率就是 SUM / N!
#include <bits/stdc++.h> using namespace std; long long fac[21]; long long stir[21][21]; void init() { fac[1] = 1; for(int i=2;i<21;i++) fac[i] = i*fac[i-1]; memset(stir,0,sizeof(stir)); stir[0][0] = 1; stir[1][1] = 1; for(int i=2;i<21;i++) { for(int j=1;j<=i;j++) stir[i][j] = stir[i-1][j-1] + (i-1)*stir[i-1][j]; } } int main() { init(); int t; scanf("%d",&t); while(t--) { int n,k; scanf("%d%d",&n,&k); long long cnt = 0; for(int i=1;i<=k;i++) cnt+= stir [i] - stir[n-1][i-1]; printf("%.4lf\n",1.0*cnt/fac ); } return 0; }
View Code
相关文章推荐
- 基础DP-第一类斯特林数-递推-hdu-3625-挑战程序设计2-q
- [第一类斯特林数] HDU 3625 Examining the Rooms
- HDU 3625 Examining the Rooms(第一类斯特林数)
- hdu 3625 Examining the Rooms(第一类斯特林数)
- 【第一类斯特林数】HDU_3625_Examining the Rooms
- Examining the Rooms - HDU 3625 第一类斯特林数
- Hdu 3625 Examining the Rooms[第一类斯特林数]
- 【HDU 4372】 Count the Buildings (第一类斯特林数)
- hdu 4372 Count the Buildings(第一类斯特林数)
- HDU 3625 Examining the Rooms 第一类斯特林数
- HDU 3625 Examining the Rooms (第一类斯特灵数,组合数学)
- hdu 4372 第一类斯特林数
- hdu 3625 Examining the Rooms 轮换斯特林数
- 【杭电oj】3625 - Examining the Rooms(第一类斯特林数打表)
- 【第一类斯特林数】HDU_4372_ Count the Buildings
- HDU 4372: Count the Buildings 第一类斯特林数 组合数学
- HDU 4372 Count the Buildings [第一类斯特林数]
- hdu 4372 第一类斯特林数
- HDU 3625 Examining the Rooms(斯特林数)
- hdu 3625 第二类斯特林数