看了题解才知道是第一类stirling数。。。将n个元素组成k个环排列。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
long long f[30][30];
long long multi(int n) //总得情况数(全排列)n!
{
long long sum=1;
while(n){
sum*=n;
n--;
}
return sum;
}
int main()
{
int t,n,k,i,j;
long long m,sum;
double p;
scanf("%d",&t);
memset(f,0,sizeof(f));
for(i=1;i<30;i++)
for(j=1;j<30;j++){
if(i==j) f[i][j]=1;
else
f[i][j]=f[i-1][j-1]+(i-1)*f[i-1][j];
}
while(t--){
scanf("%d %d",&n,&k);
m=multi(n);
sum=0;
for(i=1;i<=k;i++)
sum+=f[n][i]-f[n-1][i-1]; //n个元素组成k个环的情况 减去 第一个房间单独成环的情况
p=sum*1.0/m;
printf("%.4lf\n",p);
}
//system("pause");
return 0;
}