Examining the Rooms HDU - 3625(第一类斯特林数)

Examining the Rooms

HDU - 3625

题意:n个房间,每个房间里有一把钥匙(等概率),每进到一个房间可以得到钥匙去该钥匙对应的房间,如果当前没有钥匙则可以破门而入(1号房间不能破门而入),不过最多破门而入k次,问成功进入n个房间的总概率。

明显是求n个元素的i个环排列,i = 1,2,……,k.

不过要减去第一个房间自环的情况。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int mod = 1e9+7;
 5 const int maxn = 21;
 6 ll s1[maxn][maxn], f[maxn];
 7 void init(){
 8     for(int i = 1; i < maxn; i++) {
 9         s1[i][0] = 0;
10         s1[i][i] = 1;
11         for(int j = 1; j < i; j++) {
12             s1[i][j] = (s1[i-1][j-1] + (i-1)*s1[i-1][j]);
13         }
14     }
15     f[1] = 1;
16     for(int i = 2; i <= 20; i++) {
17         f[i] = f[i-1] * i;
18     }
19 }
20 int main(){
21     int n, k;
22     int t;
23     scanf("%d", &t);
24     init();
25     while(t--) {
26         scanf("%d %d", &n, &k);
27         double ans=0;
28         for(int i = 1; i <= k; i++) ans += (s1[n][i] - s1[n-1][i-1])*1.0 / f[n];
29         printf("%.4lf\n", ans);
30     }
31 }

时间: 2024-07-31 19:43:16

Examining the Rooms HDU - 3625(第一类斯特林数)的相关文章

hdu 3625 第一类斯特林数

题目链接:click here Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1146    Accepted Submission(s): 689 Problem Description A murder happened in the hotel. As the best detective

hdu 3625 第一类striling 数

1 /** 2 第一类Stirling数是有正负的,其绝对值是包含n个元素的集合分作k个环排列的方法数目. 3 递推公式为, 4 S(n,0) = 0, S(1,1) = 1. 5 S(n+1,k) = S(n,k-1) + nS(n,k). 6 7 大意: 有n个房间,n把钥匙,钥匙在房间中,问: 在最多破坏k个门的情况下,问有多少种方法,可以将所有的门打开,注意,不能破坏第一个门 8 9 思路: 即是将n个元素分成m个环,得排列方式..除掉第一个元素独立成环的方式 10 可以得出,这是第一类

hdu 4372 第一类斯特林数

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st

hdu 3625 Examining the Rooms —— 第一类斯特林数

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 学习斯特林数:https://blog.csdn.net/qq_33229466/article/details/75042895 https://www.cnblogs.com/gzy-cjoier/p/8426987.html http://www.cnblogs.com/zhouzhendong/p/Stirling-Number.html 关于这道题: 得到一把钥匙后,可以连续开的门与钥匙

HDU 3625 Examining the Rooms(第一类斯特林数)

题意:给你n扇门,然后可以开k次门,每次们后都有一把钥匙,不能开1号门,问最后打开一号门的概率是多少 思路:看大家说是裸的第一类斯特林数,我觉得有篇博客写的很好(传送门),这里采取的是博客里的第二种思路,感觉这种如果想到的话更容易理解,但是并没有遇到博客里说的g++会wa的情况 代码: #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=55; LL s1[maxn][maxn];

HDU3625(SummerTrainingDay05-N 第一类斯特林数)

Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1661    Accepted Submission(s): 1015 Problem Description A murder happened in the hotel. As the best detective in the town, yo

hdu 4372 第一类stirling数的应用/。。。好题

1 /** 2 大意: 给定一系列楼房,都在一条水平线上,高度从1到n,从左侧看能看到f个, 从右侧看,能看到b个,问有多少种这样的序列.. 3 思路: 因为肯定能看到最高的,,那我们先假定最高的楼房位置确定,那么在其左边还有f-1个能看见,在其右边还有b-1个,能看见..所以可以这样将题目转化: 将除最高楼之外的n-1个楼,分成f-1+b-1 组,在最高楼左边f-1 组,在其右边b-1组,那么分成f-1+b-1 组 就是第一类Stirling数.s[n-1][f-1+b-1]..左边f-1 组

【2019雅礼集训】【第一类斯特林数】【NTT&amp;多项式】permutation

目录 题意 输入格式 输出格式 思路: 代码 题意 找有多少个长度为n的排列,使得从左往右数,有a个元素比之前的所有数字都大,从右往左数,有b个元素比之后的所有数字都大. n<=2*10^5,a,b<=n 输入格式 输入三个整数n,a,b. 输出格式 输出一个整数,表示答案. 思路: 这道题是真的神啊... 首先,根据官方题解的思路,首先有一个n^2的DP: 定义dp[i][j]表示一个长度为i的排列,从前往后数一共有j个数字大于所有排在它前面的数字. 首先有转移式: \[dp[i][j]=d

第一类斯特林数

第一类斯特林数大概是这样一个意思:首先从n排列中选出一个m圆排列,这个圆排列也可以理解为有一个位置元素固定的排列,其方案数显然为(m-1)!. 可以用来解决一下有特殊位置的计数问题. 例题 [FJOI2016]建筑师 首先找到最高的建筑作为分水岭后,剩下的位置可以如下划分成a-1+b-1个区间. 发现这a-1+b-1个区间第每一个都必须满足区间最大值放在最前面. 这个东西就可以用第一类斯特林数解决. https://www.cnblogs.com/zhouzhendong/p/Stirling-