/*
就是给你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;
}
HDU Examining the Rooms
最新推荐文章于 2019-09-07 09:03:09 发布