[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 ...
随机推荐
- 手机端 css 样式重置
@charset "utf-8"; body, div, ul, li, ol, h1, h2, h3, h4, h5, h6, input, textarea, select, ...
- 搭建Keepalived+LNMP架构web动态博客 实现高可用与负载均衡
环境准备: 192.168.193.80 node1 192.168.193.81 node2 关闭防火墙 [root@node1 ~]# systemctl stop firewalld #两台都 ...
- tac 反向显示文件内容
1.命令功能 tac是cat的反向拼写,功能是反向显示文件内容. 2.语法格式 tac option file 3.使用范例 [root@localhost chu]# cat test.txt ...
- window 批处理脚本获取上级目录
1 SET CurrDir=%CD% CD.. SET InstPath=%CD% CD %CurrDir% 2 pushd.. set parent=%cd% popd 参考: https://ms ...
- JavaScript 工作原理之十-使用 MutationObserver 监测 DOM 变化
原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十章. 网络 ...
- Java 根据银行卡号获取银行名称以及图标
转 https://blog.csdn.net/N_007/article/details/78835526 参考 CNBankCard 中国各大银行卡号查询 一.支付宝接口获取名称 根据 卡号 获取 ...
- Java常用类库API之MD5简单使用
常用类库--MD5简单使用 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash v ...
- error: call of overloaded ‘sqrt(double&)’ is ambiguous
OpenFOAM定义了新的sqrt,当引入新的Library时,必须显式地使用std::sqrt(),否则会报如下错误: error: call of overloaded 'sqrt(double& ...
- 对webpack的初步研究1
一.概念: 1.webpack的核心是用于现代JavaScript应用程序的静态模块捆绑器.当webpack处理您的应用程序时,它会在内部构建一个依赖关系图,它映射您的项目所需的每个模块并生成一个或多 ...
- python学习笔记(十六)python操作redis数据库
Redis是一个key-value存储系统,它支持丰富的数据类型,如:string.list.set.zset(sorted set).hash. Redis特点 Redis以内存作为数据存储介质,所 ...