n个门,最多打爆k个门,也就是最多有k个环(第一类斯特林数)。把1个环到k个环的情况全加起来,每次加的时候还要减去1号自己成环的情况。
S[N][i]是n个元素i个环排列,S[N-1][i-1]就是1自己成环的情况。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL fac[22];
LL S[22][22];
void init()
{
fac[0] = 1;
for(LL i = 1; i <= 20; ++i)
fac[i] = fac[i-1]*i;
for(int i = 1; i <= 20; ++i)
{
S[i][i] = 1;
S[i][0] = 0;
for(int j = 1; j < i; ++j)
S[i][j] = (i-1)*S[i-1][j] + S[i-1][j-1];
}
}
int main()
{
init();
int T,N,K;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&N,&K);
LL sum = 0;
for(int i = 1; i <= K; ++i)
sum += S[N][i]-S[N-1][i-1];
printf("%.4f\n",1.0*sum/fac[N]);
}
return 0;
}