<题目链接>

<转载于 >>> >

题目大意:
有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【第一类斯特灵数】相关推荐

  1. hdu-3625 Examining the Rooms(斯特灵数第一类)

    http://acm.hdu.edu.cn/showproblem.php?pid=3625 /**************************************************** ...

  2. hdu - 2512 一卡通大冒险 (斯特灵数 贝尔数)

    http://acm.hdu.edu.cn/showproblem.php?pid=2512 /** 题意:给你k张不同的卡放到n本书里有多少种放法?(n是无限大) 典型的 斯特灵数第二类 +贝尔数 ...

  3. [HDU 3625] Examining the Rooms(第一类斯特林数)

    Examining the Rooms problem solution code problem hdu 3625 solution 之前考试有一道题:最多砸开 kkk 扇门,采取最有操作,求把 n ...

  4. HDU 3625 Examining the Rooms(10年天津网赛,斯特灵数)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove 题目:给出N个房间,每个房间的钥 ...

  5. ACM常用数列(斐波那契数列、卡特兰数、贝尔数、斯特灵数)

    斐波那契数列:任意一个数是其前两位数只和,即f(i)=f(i-1)+f(i-2),f(1)=f(2)=1 该数列也满足黄金分割比例,所以又成为黄金分割数列 相关题目链接:Fibbonacci Numb ...

  6. 斯特灵数 (Stirling数)

    @维基百科 在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的. 第一类 s(4,2)=11 第一类Stirling数是有正负的,其绝对值是个元素的项目分 ...

  7. C语言复习之判断Armstrong数(阿姆斯壮数)

    首先我们来了解一下什么是Armstrong数(阿姆斯壮数) 在百度百科上阿姆斯壮数是这样说的:Armstrong 数,就是n位数的各位数的n次方之和等于该数 比如: 153=1^3+5^3+3^3 1 ...

  8. Move Hurst Computer 移动平均赫斯特指数计算

    Move Hurst Computer 移动平均赫斯特指数计算 赫斯特指数(Hurst exponent) 赫斯特指数简介 基于重标极差(R/S)分析方法基础上的赫斯特指数(H)的研究是由英国水文专家 ...

  9. 【HDU No. 4006】 第k 大的数 The kth great number

    [HDU No. 4006] 第k 大的数 The kth great number 杭电OJ 题目地址 [题意] 小明和小宝正在玩数字游戏.游戏有n轮,小明在每轮中都可以写一个数,或者问小宝第k 大 ...

最新文章

  1. 【AI】CelebA数据介绍、下载及说明
  2. 《Revisiting Salient Object Detection! Simultaneous Detection, Ranking, and Subitizing of Multiple Sa
  3. centos7搭建需密码登入的简易ftp服务器
  4. ubuntu更换阿里源
  5. 城市问题(Floyd)
  6. 三十四、深入Vue.js语法(中篇)
  7. Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))
  8. JUnit中测试异常抛出的方法
  9. when click one item in table Select at least one column to perform the search
  10. java中重载 参数顺序_Java方法中的参数太多,第4部分:重载
  11. JSP页面中使用超链接进行传输参数(参数是一个本地磁盘链接)问题
  12. printf()语句
  13. Linux虚拟机中vim编辑器常用命令介绍(一)
  14. Unity开发——CPU优化篇
  15. PHPWAMP自定义php版本的方法
  16. 【计算机网络】计算机网络基础知识
  17. 小程序如何跳转至同服务器app,小程序新功能,app可以直接跳转小程序
  18. skywalking-介绍
  19. Landmark Guidance Independent Spatio-channel Attention and Complementary ContextInformationbased FER
  20. 【Java】抽象类继承的综合案例

热门文章

  1. cocos2dx spine之一 :spine缓存 (c++ lua)
  2. Linux 基础命令
  3. Altium Designer 发现的机密
  4. python之地基(三)
  5. Buffer.isBuffer()详解
  6. ASP.net 资源请求漏洞利用工具PadBuster
  7. django model中的meta类
  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...
  9. DEDE 5.7分类联动BUG
  10. flash 绘图API:绘制基础的图形