HDU 3625 Examining the Rooms:第一类stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625
题意:
有n个房间,每个房间里放着一把钥匙,对应能开1到n号房间的门。
除了1号门,你可以踹开任意一扇门(不用钥匙),但你最多只能踹k次。
问你能将所有门打开的概率。
题解:
· P(打开所有门) = 能打开所有门的钥匙放置情况数 / 钥匙放置的总情况数
· 钥匙放置的总情况数 = n!
那么考虑下能打开所有门的钥匙放置情况数。。。
由于每个房间里有且只有一把钥匙,所以如果将每个房间连向房间内钥匙对应的房间,会得到一个有向图,并且由若干个独立的环组成。

所以,只要将一个环内的任意一扇门踹开,就能打开这个环上的所有房间。
如果不考虑1号门,那么要算的就是n个元素组成1~k个环排列的情况数。
第一类Stirling数的定义啊!
递推式:s(n,k) = s(n-1,k-1) + (n-1)*s(n-1,k)
So...
· 能打开所有门的钥匙放置情况数 = ∑S(n,i) (1<=i<=k)
考虑到1号门不能踹,也就是1不能独立成环,它的情况数就等于用剩下n-1的元素组成i-1个环的情况数。
· 能打开所有门的钥匙放置情况数 = ∑( S(n,i)-S(n-1,i-1) )
所以答案为:∑( S(n,i)-S(n-1,i-1) ) / n! (1<=i<=k)
AC Code:
// s(n,k) = s(n-1,k-1) + (n-1)*s(n-1,k)
// s(n,0) = 0 s(n,n) = 1
// P = sigma(s[n][i]-s[n-1][i-1])/fact(n) 1<=i<=k #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 25
#define MAX_K 25 using namespace std; int n,k,t;
long long sum;
long long s[MAX_N][MAX_K];
long long fact[MAX_N]; void stirling()
{
memset(s,,sizeof(s));
for(int i=;i<MAX_N;i++)
{
s[i][i]=;
for(int j=;j<i;j++)
{
s[i][j]=s[i-][j-]+(i-)*s[i-][j];
}
}
} void cal_fact()
{
fact[]=;
for(int i=;i<MAX_N;i++)
{
fact[i]=fact[i-]*i;
}
} int main()
{
stirling();
cal_fact();
cin>>t;
for(int cas=;cas<=t;cas++)
{
cin>>n>>k;
sum=;
for(int i=;i<=k;i++)
{
sum+=s[n][i]-s[n-][i-];
}
printf("%.4f\n",(double)sum/fact[n]);
}
}
HDU 3625 Examining the Rooms:第一类stirling数的更多相关文章
- [HDU 3625]Examining the Rooms (第一类斯特林数)
[HDU 3625]Examining the Rooms (第一类斯特林数) 题面 有n个房间,每个房间有一个钥匙,钥匙等概率的出现在n个房间内,每个房间中只会出现且仅出现一个钥匙.你能炸开门k次, ...
- hdu 3625 Examining the Rooms —— 第一类斯特林数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 学习斯特林数:https://blog.csdn.net/qq_33229466/article/d ...
- hdu 3625 Examining the Rooms——第一类斯特林数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 n^2 求斯特林数就行.要减去的就是1号钥匙在1号房间的方案,即 s[ n-1 ][ m-1] . ...
- hdu 3625 Examining the Rooms 轮换斯特林数
题目大意 n个房间对应n把钥匙 每个房间的钥匙随机放在某个房间内,概率相同. 有K次炸门的机会,求能进入所有房间的概率 一号门不给你炸 分析 我们设\(key_i\)为第i间房里的钥匙是哪把 视作房间 ...
- HDU3265 Examining the Rooms【stirling数】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=3625 题目大意: 有N个房间,每一个房间的要是随机放在某个房间内,概率同样.有K次炸门的机会. 求 ...
- HDU 3625 Examining the Rooms【第一类斯特灵数】
<题目链接> <转载于 >>> > 题目大意:有n个锁着的房间和对应n扇门的n把钥匙,每个房间内有一把钥匙.你可以破坏一扇门,取出其中的钥匙,然后用取出钥匙打 ...
- HDU 3625 Examining the Rooms
题目大意:有n个房间,n!个钥匙,在房间中,最多可以破k扇门,然后得到其中的钥匙,去开其它的门,但是第一扇门不可以破开,求可以打开所有门的概率. 题解:首先,建立这样的一个模型,题目相当于给出一个图, ...
- HDU 4372 Count the Buildings:第一类Stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4372 题意: 有n栋高楼横着排成一排,各自的高度为1到n的一个排列. 从左边看可以看到f栋楼,从右边看 ...
- hdu 4372 第一类stirling数的应用/。。。好题
/** 大意: 给定一系列楼房,都在一条水平线上,高度从1到n,从左侧看能看到f个, 从右侧看,能看到b个,问有多少种这样的序列.. 思路: 因为肯定能看到最高的,,那我们先假定最高的楼房位置确定,那 ...
随机推荐
- VMware中Mac OS中显示共享文件夹的方法
在finder 偏好设置里的通用标签下,勾选 “已连接的服务器”
- getResources提取资源文件
String pxsize = context.getResources().getString(R.string.hello); 资源文件格式: <?xml version="1.0 ...
- etcd raft如何实现成员变更
成员变更在一致性协议里稍复杂一些,由于不同的成员不可能在同一时刻从旧成员组切换至新成员组,所以可能出现两个不相交的majority,从而导致同一个term出现两个leader,进而导致同一个index ...
- Java之数字处理类浅析
包装类: 数据类型相对的包装类:byte---Byteshort---Shortint---Integerlong---Long float---Floatdouble---Double boolea ...
- 读Zepto源码之Event模块
Event 模块是 Zepto 必备的模块之一,由于对 Event Api 不太熟,Event 对象也比较复杂,所以乍一看 Event 模块的源码,有点懵,细看下去,其实也不太复杂. 读Zepto源码 ...
- 小哈学Python-第一课:基本介绍
Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
- linux系统编程之文件IO
1.打开文件的函数open,第一个参数表示文件路径名,第二个为打开标记,第三个为文件权限 代码: #include <sys/types.h> #include <sys/stat. ...
- 微信小程序探索(一)
一.小程序到底是个什么鬼? 现在Android系统越用越卡的现状很头疼,手机上再也不想装太多的App,而市面上层出不穷的各种应用,有时又是我们需要用到的,怎么办呢!!微信小程序就是一种不需要下载安装即 ...
- Let's Encrypt与DNS轮循
本文由网络安全研究员.securityheaders.io和report-uri.io创始人Scott Helme发布在其个人博客中.描述了如何使用Let's Encrypt的同时兼容DNS轮循. 早 ...
- (转)$.extend()方法和(function($){...})(jQuery)详解
1. JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...