HDU 3625 Examining the Rooms【第一类斯特灵数】
<题目链接>
<转载于 >>> >
题目大意:
有n个锁着的房间和对应n扇门的n把钥匙,每个房间内有一把钥匙。你可以破坏一扇门,取出其中的钥匙,然后用取出钥匙打开另一扇门(如果取出的钥匙能打开房门则接着打开,取出其中钥匙,如此往复,若打不开则继续破坏一扇门)。最多可以破坏k(k<=n)扇门,但是编号为1的门只能用钥匙打开。求能打开所有门(被破坏或是被钥匙打开)的概率。
解题分析:
钥匙和门的关系是成环状的,打开一个门之后,该环内的所有房间都可以进入,怎么说呢,就拿Hint里的#6来举例,Room1 Room2 Room3是在一个环当中的,假设我破坏了Room3,那么我取出Room3内的钥匙Key2就可以打开Room2,而Room2里有钥匙Key1,那我们又可以打开Room1。
因此,该题就转化成了求N个房间形成1~K个环有多少种可能,然后除以总的分配方案数即为题目要我们求的概率。
首先,总的分配方案数是比较好求的,N的全排列N!种,因为N<=20,有可能超int型范围,所以__int64或long long是必不可少的
其次就是求N个房间成i个环的种类数了,而第一类斯特林数S(N,K)=S(N-1,K-1)+(N-1)*S(N-1,k)恰恰就是求N个元素形成K个非空循环排列的方法数
剩下的就是枚举形成的环,但是要排除掉编号为1的房间独立成环的可能
S(N,M)-S(N-1,M-1),表示N个元素形成M个环,减去1独自成环,即剩下的N-1个元素形成M-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];void INIT() {for (int i = 1; i<21; i++)fac[i] = fac[i - 1] * i; //计算阶乘for (int i = 1; i <= 20; i++) //计算stir数组,表示让n个物品形成m个环的方案数 {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 main() {INIT();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; }
2018-08-12
转载于:https://www.cnblogs.com/00isok/p/9465569.html
HDU 3625 Examining the Rooms【第一类斯特灵数】相关推荐
- hdu-3625 Examining the Rooms(斯特灵数第一类)
http://acm.hdu.edu.cn/showproblem.php?pid=3625 /**************************************************** ...
- hdu - 2512 一卡通大冒险 (斯特灵数 贝尔数)
http://acm.hdu.edu.cn/showproblem.php?pid=2512 /** 题意:给你k张不同的卡放到n本书里有多少种放法?(n是无限大) 典型的 斯特灵数第二类 +贝尔数 ...
- [HDU 3625] Examining the Rooms(第一类斯特林数)
Examining the Rooms problem solution code problem hdu 3625 solution 之前考试有一道题:最多砸开 kkk 扇门,采取最有操作,求把 n ...
- HDU 3625 Examining the Rooms(10年天津网赛,斯特灵数)
转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove 题目:给出N个房间,每个房间的钥 ...
- ACM常用数列(斐波那契数列、卡特兰数、贝尔数、斯特灵数)
斐波那契数列:任意一个数是其前两位数只和,即f(i)=f(i-1)+f(i-2),f(1)=f(2)=1 该数列也满足黄金分割比例,所以又成为黄金分割数列 相关题目链接:Fibbonacci Numb ...
- 斯特灵数 (Stirling数)
@维基百科 在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的. 第一类 s(4,2)=11 第一类Stirling数是有正负的,其绝对值是个元素的项目分 ...
- C语言复习之判断Armstrong数(阿姆斯壮数)
首先我们来了解一下什么是Armstrong数(阿姆斯壮数) 在百度百科上阿姆斯壮数是这样说的:Armstrong 数,就是n位数的各位数的n次方之和等于该数 比如: 153=1^3+5^3+3^3 1 ...
- Move Hurst Computer 移动平均赫斯特指数计算
Move Hurst Computer 移动平均赫斯特指数计算 赫斯特指数(Hurst exponent) 赫斯特指数简介 基于重标极差(R/S)分析方法基础上的赫斯特指数(H)的研究是由英国水文专家 ...
- 【HDU No. 4006】 第k 大的数 The kth great number
[HDU No. 4006] 第k 大的数 The kth great number 杭电OJ 题目地址 [题意] 小明和小宝正在玩数字游戏.游戏有n轮,小明在每轮中都可以写一个数,或者问小宝第k 大 ...
最新文章
- 【AI】CelebA数据介绍、下载及说明
- 《Revisiting Salient Object Detection! Simultaneous Detection, Ranking, and Subitizing of Multiple Sa
- centos7搭建需密码登入的简易ftp服务器
- ubuntu更换阿里源
- 城市问题(Floyd)
- 三十四、深入Vue.js语法(中篇)
- Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))
- JUnit中测试异常抛出的方法
- when click one item in table Select at least one column to perform the search
- java中重载 参数顺序_Java方法中的参数太多,第4部分:重载
- JSP页面中使用超链接进行传输参数(参数是一个本地磁盘链接)问题
- printf()语句
- Linux虚拟机中vim编辑器常用命令介绍(一)
- Unity开发——CPU优化篇
- PHPWAMP自定义php版本的方法
- 【计算机网络】计算机网络基础知识
- 小程序如何跳转至同服务器app,小程序新功能,app可以直接跳转小程序
- skywalking-介绍
- Landmark Guidance Independent Spatio-channel Attention and Complementary ContextInformationbased FER
- 【Java】抽象类继承的综合案例
热门文章
- cocos2dx spine之一 :spine缓存 (c++ lua)
- Linux 基础命令
- Altium Designer 发现的机密
- python之地基(三)
- Buffer.isBuffer()详解
- ASP.net 资源请求漏洞利用工具PadBuster
- django model中的meta类
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...
- DEDE 5.7分类联动BUG
- flash 绘图API:绘制基础的图形