一开始看到这道题我以为是要用排列组合的做法去做,可是想着想着发现不对劲,然后我又又又学到一个新的东西:第一类斯特林数。
下面是两个我学第一类斯特林数的博客:
https://www.cnblogs.com/nanke/archive/2011/09/07/2170290.html
https://blog.csdn.net/liusuangeng/article/details/43456117
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long int
LL stir[21][21];
LL jie[21];
void init()
{
stir[1][0]=0;
stir[1][1]=1;
jie[1]=1;
for(int i=2;i<=20;i++)
jie[i]=jie[i-1]*i;
for(int i=2;i<=20;i++)
for(int j=1;j<=i;j++)
stir[i][j]=stir[i-1][j-1]+(i-1)*stir[i-1][j];
}
int main()
{
int t;
scanf("%d",&t);
init();
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
LL ans=0;
for(int i=1;i<=k;i++)
ans+=stir[n][i]-stir[n-1][i-1];
printf("%.4lf\n",ans*1.0/jie[n]);
}
}