题意:给 个点(各有一条出边),求成少于 个环( 不能单独成环)的概率。
转化成先求方案数再求概率,方案数显然和第一类stirling数有关
发现就是累加
每次减去
即
单独成环的方案数就行了。
#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;
}