HDU Examining the Rooms

本文介绍了一道经典的概率计算问题,通过斯特林第一类数求解特定条件下打开所有房间的概率,并提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
就是给你N个房间,然后每个房间1把钥匙,你最初手里没有任何钥匙,要靠破门而入!这里只有第一个房间不能破门进去,其他都可以,

给你房间数N,和最多能破门的个数,让你求能全部把房间打开的概率!

题目分析:

又是是我的第一次啊!受教育了?有木有?这种题目是斯特林第一类数的应用,虽然很裸,但是很经典啊 !

首先这题其实让我们求的是给 N个元素,让我们求K个环排列的 方法数。

斯特林第一类数的第推公式:

S(N,0)=0;

S(N,N)=1;

S(0,0)=0;

S(N,K)=S(N-1,K-1)+S(N-1,K)*(N-1);

这个公式的意思是:

当前N-1个数构成K-1 个环的时候,加入第N个 ,N只能构成单环!—S(N-1,K-1)

如果N-1个数构成K个环的时候,加入第N个,N可以任意加入,N-1内的一个环里,所以是–(N-1)*S(N-1,K)

这个题目里,因为不能破坏第1个门:
转http://blog.sina.com.cn/s/blog_735b07180100wln3.html
*/
#include<stdio.h>
#include<string.h>

typedef __int64 lld;
const int maxn=21;
lld fac[maxn];
lld str[maxn][maxn];
int n,m;
int main(){
	int i,j,k,T;
	fac[1]=1;
	for(i=2;i<maxn;i++)
		fac[i]=fac[i-1]*i;
	memset(str,0,sizeof(str));
	str[1][1]=1;str[1][0]=0;
	for(i=2;i<maxn;i++)
		for(j=1;j<=i;j++){
			str[i][j]=str[i-1][j-1]+str[i-1][j]*(i-1);
		}
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		lld sum=0;
		for(i=1;i<=m;i++)
			sum+=str[n][i]-str[n-1][i-1];
		double ans=(sum)*1.0/fac[n];
		printf("%.4lf\n",ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值