HDU 3625

有点置换群的味道。

当撞开一个门后,能打开一连串的门,即是可以排成一个圈。求的是种数,于是,可以使用第一类斯特林数,求出撞了0~K次的种数。

但是,注意,当第一个门为独自一个圈时,是不可行的,因为这代表第一个门要撞开,这违犯规则。所以,把第一个门独立成圈的情况去掉。即是求出S(N-1,K-1)以前的各种情况了。减去即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL __int64

using namespace std;

LL str[21][21];
LL cn[21];
void initial(){
	cn[0]=1;
	for(LL i=1;i<=20;i++)
	cn[i]=cn[i-1]*i;
	for(LL i=0;i<=20;i++){
		for(LL j=0;j<=i;j++){
			if(i==j)
			str[i][j]=1;
			else if(j==0)
			str[i][j]=0;
			else{
				str[i][j]=(i-1)*str[i-1][j]+str[i-1][j-1];
			}
		}
	}
}

int main(){
	initial();
	int T,n,k;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&k);
		LL up=0;
		LL down=cn[n];
		for(int i=0;i<=k;i++)
		up+=str[n][i];
		for(int i=0;i<=k-1;i++)
		up-=str[n-1][i];
		double ans=(double)up/(double)down;
		printf("%0.4lf\n",ans);
	}
	return 0;
}

  

时间: 2024-10-12 20:54:57

HDU 3625的相关文章

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 可以得出,这是第一类

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 lon

HDU 3625 Examining the Rooms:第一类stirling数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3625 题意: 有n个房间,每个房间里放着一把钥匙,对应能开1到n号房间的门. 除了1号门,你可以踹开任意一扇门(不用钥匙),但你最多只能踹k次. 问你能将所有门打开的概率. 题解: · P(打开所有门) = 能打开所有门的钥匙放置情况数 / 钥匙放置的总情况数 · 钥匙放置的总情况数 = n! 那么考虑下能打开所有门的钥匙放置情况数... 由于每个房间里有且只有一把钥匙,所以如果将每个房间连向房间内

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 第一类斯特林数

题目链接: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 Examining the Rooms

Problem Description A murder happened in the hotel. As the best detective in the town, you should examine all the N rooms of the hotel immediately. However, all the doors of the rooms are locked, and the keys are just locked in the rooms, what a trap

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

最多可以暴力打开k次 对于一个环暴力一次 n个数排成i个(i<=k)非空环排列的种数 另外第一扇门不能暴力打开 所以1不能独立成环 #include <cstdio> #include <cstring> using namespace std; typedef __int64 LL; LL dp[22][22]; LL f[22]; int main() { dp[0][0] = 1; f[0] = 1; for(int i = 1; i <= 20; i++) {

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];

数论一

1.UVa 10916  Factstone Benchmark(对数函数的利用--乘化加) 题意:给出年份,每个10年对应一个当前计算机可支持的字节位数,计算n! < max(max 为当前计算机能表示的最大整数),求最大n. 思路:字节数k = (year - 1940) / 10,  问题就转化成 n ! < 2 ^ k < (n + 1) !, 对两边同取对数,因为log(a*b) = log(a) + log(b);所以log(n!) = sum(log(i)), ( 1<