HDU3265 Examining the Rooms【stirling数】
题目链接:
http://acm.hdu.edu.cn/showproblem.php?
pid=3625
题目大意:
有N个房间,每一个房间的要是随机放在某个房间内,概率同样。有K次炸门的机会。
求能打开全部房间门,进入全部房间的概率有多大。
解题思路:
门和钥匙的相应关系出现环。打开一个门后,环内的门都能够打开。
也就意味着:
N个房间的钥匙与门形成1~K个环的概率有多大。
也就是求N个元素。构成K个以内的环,且1不成自环的概率。
N个元素形成K个环的方法数是第一类stirling数 S(N。K)。
N个元素形成K个环。且1成自环的方法数是S(N-1,K-1)。
则N个元素形成K个环。且1不成自环的方法数是S(N。K) - S(N-1,K-1)。
要是随机放的总的方法数为N!。
则概率P(N,K)为( S(N,K) - S(N-1,K-1) + S(N。K-1) - S(N-1。K-2) + … +
S(N,1) - S(N。0) ) / N!
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std; LL F[25],Stirling[25][25]; void Solve()
{
F[0] = 1;
for(int i = 1; i <= 20; ++i) //阶乘数组
F[i] = i*F[i-1]; for(int i = 1; i <= 20; ++i) //算出第一类stirling数
Stirling[i][0] = 0;
Stirling[1][1] = 1;
for(int i = 1; i <= 20; ++i)
{
for(int j = 1; j <= i; ++j)
{
if(i == j)
Stirling[i][j] = 1;
else
Stirling[i][j] = Stirling[i-1][j-1] + (i-1)*Stirling[i-1][j];
}
} for(int i = 1; i <= 20; ++i) //取绝对值
{
for(int j = 1; j <= 20; ++j)
{
Stirling[i][j] = abs(Stirling[i][j]);
}
}
} int main()
{
Solve();
int T,N,K;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&N,&K);
LL sum = 0;
for(int i = 1; i <= K; ++i)
sum += Stirling[N][i] - Stirling[N-1][i-1];
printf("%.4f\n",(double)sum / (double)F[N]); //.4lf输出不了正确结果
} return 0;
}
HDU3265 Examining the Rooms【stirling数】的更多相关文章
- HDU 3625 Examining the Rooms:第一类stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625 题意: 有n个房间,每个房间里放着一把钥匙,对应能开1到n号房间的门. 除了1号门,你可以踹开任 ...
- 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms
Examining the Rooms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Examining the Rooms(dp,斯特灵数)
Examining the Rooms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- [HDU 3625]Examining the Rooms (第一类斯特林数)
[HDU 3625]Examining the Rooms (第一类斯特林数) 题面 有n个房间,每个房间有一个钥匙,钥匙等概率的出现在n个房间内,每个房间中只会出现且仅出现一个钥匙.你能炸开门k次, ...
- lightOJ 1326 Race(第二类Stirling数)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1326 题意:有n匹马赛跑.问有多少种不同的排名结果.可以有多匹马的排名相同. 思路:排 ...
- 斯特灵数 (Stirling数)
@维基百科 在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的. 第一类 s(4,2)=11 第一类Stirling数是有正负的,其绝对值是个元素的项目分 ...
- hdu 4372 第一类stirling数的应用/。。。好题
/** 大意: 给定一系列楼房,都在一条水平线上,高度从1到n,从左侧看能看到f个, 从右侧看,能看到b个,问有多少种这样的序列.. 思路: 因为肯定能看到最高的,,那我们先假定最高的楼房位置确定,那 ...
- HDU 4372 Count the Buildings:第一类Stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4372 题意: 有n栋高楼横着排成一排,各自的高度为1到n的一个排列. 从左边看可以看到f栋楼,从右边看 ...
- 整理一点与排列组合有关的问题[组合数 Stirling数 Catalan数]
都是数学题 思维最重要,什么什么数都没用,DP直接乱搞(雾.. 参考LH课件,以及资料:http://daybreakcx.is-programmer.com/posts/17315.html 做到有 ...
随机推荐
- 一个简单的MyBatis项目(应用)
### 1. MYBATIS简介 MYBATIS是持久层框架,大大的简化了持久层开发. 当使用MYBATIS框架时,开发人员不必再编写繁琐的JDBC代码,只需要定义好每个功能对应的抽象方法与需要执 ...
- TypeError: Cannot use 'in' operator to search for 'length' in....
前台页面读取商品属性是字符串形式,数据库中存储商品属性是集合形式,前台数据存入数据库中数据格式会自动转,后台数据回显到前台数据格式需要手动转换,否则会报异常 错误信息提示:
- C#获取实例运行时间StopWatch类
在程序运行时有时需要获取某一步骤的操作时间,C#提供的StopWatch类可以很方便的实现这一目的. StopWatch sw=new StopWatch(); sw.Start(); //Do So ...
- BZOJ 2119 股市的预测(后缀数组)
首先要差分+离散化. 然后就是求形如ABA的串有多少,其中B的长度确定为k. 我们用到了设置关键点的思想.我们枚举A的长度L.然后在\(1,1+L,1+L*2,1+L*3...\)设置关键点.然后我们 ...
- BZOJ 1050 [HAOI2006]旅行comf(最小生成树)
题意 第一行包含两个正整数,N和M.下来的M行每行包含三个正整数:x,y和v.表示景点x到景点y之间有一条双向公路 ,车辆必须以速度v在该公路上行驶.最后一行包含两个正整数s,t,表示想知道从景点s到 ...
- 从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题
这一章节我们来介绍在其它对象上同步与ThreadLocal. 前一章节我们使用了 1.synchronized在其它对象上同步 class ThreadA implements Runnable { ...
- 主程的晋升攻略(4):TCP、消息分包和协议设计
在<主程的晋升攻略(3):IP.DNS和CDN>中,一次网络请求经过DNS解析知道了目的IP,如今就要发出网络包,这里我们说一说TCP的相关话题. TCP是一种流式协议 讲网络编程的教科书 ...
- 第二章 Linux常用命令
1.命令基础 命令格式: 命令名 [选项] [参数1] [参数2] 命令必须小写,命令正常执行后返回一个0,表示执行成功,如果执行出错,就反悔一个非零值 2.简单的几个命令 who:列出所有正在 ...
- 常见的DNS攻击——偷(劫持)、骗(缓存投毒)、打(DDos)
常见的DNS攻击包括: 1) 域名劫持 通过采用黑客手段控制了域名管理密码和域名管理邮箱,然后将该域名的NS纪录指向到黑客可以控制的DNS服务器,然后通过在该DNS服务器上添加相应域名纪录,从而使网民 ...
- hdoj--1301--Jungle Roads(克鲁斯卡尔)
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...