[HDU3625] [2010杭州区域赛] Examining the Rooms [第一类Stirling数]

题意:给 N N 个点(各有一条出边),求成少于 K K 个环( 1 1 不能单独成环)的概率。

转化成先求方案数再求概率,方案数显然和第一类stirling数有关
发现就是累加 S ( N , K ) S(N,K) 每次减去 S ( N 1 , K 1 ) S(N-1,K-1) 1 1 单独成环的方案数就行了。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#define REG register int
long long f[25]={},s[25][25]={};
int T,N,K;
long long Ans;
int main()  
{
	f[0]=f[1]=1; s[0][0]=0,s[1][1]=1;
	for(REG i=2;i<25;++i) f[i]=i*f[i-1];  
	for(REG i=2;i<25;++i) for(REG j=1;j<=i;++j) s[i][j]=s[i-1][j-1]+(i-1)*s[i-1][j];
	scanf("%d",&T);  
	while(T--)  
	{  
		scanf("%d%d",&N,&K); Ans=0;
		for(REG i=1;i<=K;++i) Ans+=s[N][i]-s[N][i];
		printf("%.4f\n",1.0*Ans/f[N]);  
	}  
	return 0;  
}

猜你喜欢

转载自blog.csdn.net/Estia_/article/details/82936560
今日推荐