Examining the Rooms
来源:互联网 发布:龙少站群软件下载 编辑:程序博客网 时间:2024/05/13 03:45
出处http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove
题目:给出N个房间,每个房间的钥匙随机放在某个房间内,概率相同。有K次炸门的机会,求能进入所有房间的可能性为多大。
http://acm.hdu.edu.cn/showproblem.php?pid=3625
钥匙与门的对应关系呈现出环。打开一个门之后,环内的所有房间都可以进入。也就是说N个房间形成1--K个环的可能有多大。N个房间N个钥匙的总数为N!。
之后是求N个房间形成i个环的总数。
题目还有个特殊要求,不能破1号的门。
也就是说1号不能独立成环,否则就失败。
第一类斯特林数S(P,K)=(P-1)*S(P-1,K)+S(P-1,K-1)表示的正是N个元素形个K个非空循环排列的方法数。
枚举形成的环,但是要除掉1号独立成环的可能。
S(N,M)-S(N-1,M-1),N个元素形成 M个环,减去除了1之外的N-1个元素形成M-1个环,也就是1独立成环。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #define eps 1e-7
- #define LL long long
- using namespace std;
- LL fac[21]={1};
- LL stir1[21][21];
- int main(){
- for(int i=1;i<21;i++)
- fac[i]=fac[i-1]*i;
- for(int i=1;i<=20;i++){
- stir1[i][0]=0;
- stir1[i][i]=1;
- for(int j=1;j<i;j++)
- stir1[i][j]=stir1[i-1][j-1]+(i-1)*stir1[i-1][j];
- }
- int t,n,k;
- scanf("%d",&t);
- while(t--){
- scanf("%d%d",&n,&k);
- if(n==1||k==0){
- printf("0.0000\n");
- continue;
- }
- LL sum=0;
- for(int i=1;i<=k;i++)
- sum+=stir1[n][i]-stir1[n-1][i-1];
- printf("%.4f\n",(double)sum/fac[n]);
- }
- return 0;
- }
0 0
- HDU Examining the Rooms
- Examining the Rooms
- hdu Examining the Rooms
- Examining the Rooms
- Examining the Rooms
- hdu 3625 Examining the rooms
- hdu 3625 Examining the Rooms
- HDU 3625 Examining the Rooms
- 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
- (斯特林数)Examining the Rooms--HDOJ
- HDU 3625 Examining the Rooms
- 斯特灵数 hdu 3625 Examining the Rooms
- [Stirling] HDU 3625 Examining the Rooms
- 欢迎使用CSDN-markdown编辑器
- tomcat配置到Eclipse时出现的一系列问题
- Activity遍历,一次性全部关闭
- linux系统如何管理文件
- 时间格式字符串中,大小写字母的解释
- Examining the Rooms
- Facebook的办公室标语
- Android Studio插件整理
- Tomcat自定义友好错误提示页面无法显示
- 深入浅出:Linux设备驱动之字符设备驱动
- linux下配置zookeeper,kafka,storm
- Android文件的加密与解密
- 【bzoj2337】【HNOI2011】【XOR和路径】【高斯消元】
- Android文件扫描