HDU Examining the Rooms

来源:互联网 发布:布瑞克农业大数据 编辑:程序博客网 时间:2024/05/18 15:54
/*就是给你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;}

原创粉丝点击