[HDU 3625]Examining the Rooms (第一类斯特林数)
[HDU 3625]Examining the Rooms (第一类斯特林数)
题面
有n个房间,每个房间有一个钥匙,钥匙等概率的出现在n个房间内,每个房间中只会出现且仅出现一个钥匙。你能炸开门k次,问你能进入所有房间的概率。特殊要求:不能炸1号房间的门。
T组询问
T<=2000,k<=n<=2000
分析
前置知识(如果你了解斯特林数,可以跳过)
圆排列:把n个元素排在一个圆周上,如果旋转之后两个圆周上的排列一样,那么这两个排列相同
第一类斯特林数S(n,m)表示把n个不同元素构成m个圆排列的方案数
由定义得S(n,0)=0,S(n,n)=1
第一类斯特林数有递推公式\(S(n,m)=S(n-1,m-1)+(n-1) \times S(n-1,m)\)
证明:我们考虑把第n个元素放在什么位置。如果单独形成一个圆排列,则答案就是S(n-1,m-1).
如果插入到原来的m个圆排列中,那本质上就是在n-1个元素中选一个插到它后面去(定义“后面”为顺时针方向下一个数,定义为逆时针同理),有n-1种选法,答案就是(n-1)S(n-1,m)
这样我们就可以\(O(n^2)\)处理出S的值(用NTT可以更快,但这题不需要)
解答过程
第i个房间里的钥匙p[i]构成一个排列p,而通过打开某个房间的门拿到钥匙a,用钥匙a打开门,拿到钥匙b.....这样会构成许多个环。
那么问题就转化为n个元素组成<=k个环的排列数量。直接用第一类斯特林数的定义知\(\sum_{i=1}^k S(n,i)\)
不能炸一号门其实很简单,就是一号点不能单独为环 \(S(n-1,i-1)\)
\(ans=\frac{1}{n!}\sum_{i=1}^k (S(n,i)-S(n-1,i-1))\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 20
using namespace std;
typedef long long ll;
ll fact[maxn+5];
ll S[maxn+5][maxn+5];
void ini(int n){
for(int i=0;i<=n;i++){
S[i][0]=0;
S[i][i]=1;
for(int j=1;j<i;j++){
S[i][j]=S[i-1][j-1]+(i-1)*S[i-1][j];
}
}
fact[0]=1;
for(int i=1;i<=n;i++) fact[i]=fact[i-1]*i;
}
double calc(int n,int k){
long long ans=0;
for(int i=1;i<=k;i++){
ans+=S[n][i]-S[n-1][i-1];
}
return 1.0*ans/fact[n];
}
int t,n,k;
int main(){
ini(maxn);
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&k);
printf("%.4lf\n",calc(n,k));
}
}
[HDU 3625]Examining the Rooms (第一类斯特林数)的更多相关文章
- 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间房里的钥匙是哪把 视作房间 ...
- HDU 3625 Examining the Rooms【第一类斯特灵数】
<题目链接> <转载于 >>> > 题目大意:有n个锁着的房间和对应n扇门的n把钥匙,每个房间内有一把钥匙.你可以破坏一扇门,取出其中的钥匙,然后用取出钥匙打 ...
- HDU 4372 Count the Buildings——第一类斯特林数
题目大意:n幢楼,从左边能看见f幢楼,右边能看见b幢楼 楼高是1~n的排列. 问楼的可能情况 把握看到楼的本质! 最高的一定能看见! 计数问题要向组合数学或者dp靠拢.但是这个题询问又很多,难以dp ...
- HDU 3625 Examining the Rooms:第一类stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625 题意: 有n个房间,每个房间里放着一把钥匙,对应能开1到n号房间的门. 除了1号门,你可以踹开任 ...
- HDU 4372 Count the Buildings [第一类斯特林数]
有n(<=2000)栋楼排成一排,高度恰好是1至n且两两不同.现在从左侧看能看到f栋,从右边看能看到b栋,问有多少种可能方案. T组数据, (T<=100000) 自己只想出了用DP搞 发 ...
- HDU 3625 Examining the Rooms
题目大意:有n个房间,n!个钥匙,在房间中,最多可以破k扇门,然后得到其中的钥匙,去开其它的门,但是第一扇门不可以破开,求可以打开所有门的概率. 题解:首先,建立这样的一个模型,题目相当于给出一个图, ...
- 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms
Examining the Rooms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- weakHashMap 用法
WeakHashMap,此种Map的特点是: 当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值 当使用 WeakHashMap 时,即使没有显示的添加或删除任何元 ...
- powerdesigner数据库设计
(1)创建物理数据模型 打开PowerDesigner,然后点击File-->New Model然后选择如下图所示的物理数据模型(物理数据模型的名字自己起,然后选择自己所使用的数据库即可) ( ...
- cat 合并文件或查看文件内容
1.命令功能 cat 合并文件或者查看文件内容. 2.语法格式 cat option file 参数说明 参数 参数说明 -n 打印文本,并显示每行行号并且空白行也同样包括 -b 与-n用法 ...
- codeforces Summer Earnings(bieset)
Summer Earnings time limit per test 9 seconds memory limit per test 256 megabytes input standard inp ...
- 查看Linux系统所对应的版本
#cat /etc/issue 在CentOS下执行显示为:CentOS release 5.7 (Final)Kernel \r on an \m 或在Ubuntu下显示为:Ubuntu 11.04 ...
- jsp基础模板
jsp页面基础模板 base.jsp <%@ page language="java" contentType="text/html; charset=UTF-8& ...
- Django登录(含随机生成图片验证码)注册实例
登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...
- Nginx-配置动静分离实例
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处 ...
- Spark在MaxCompute的运行方式
一.Spark系统概述 左侧是原生Spark的架构图,右边Spark on MaxCompute运行在阿里云自研的Cupid的平台之上,该平台可以原生支持开源社区Yarn所支持的计算框架,如Spark ...
- VR和AR
VR 虚拟现实,比如你天气很炎热,戴上VR眼镜,出现在你眼前的是哈尔滨的冰雪世界 AR 增强现实,比如你站在一片碧绿的草地上,给你身边来一匹快马 想想一个单身狗去电影院,给你身边来一个美女作陪,这是多 ...