在钥匙与房间的所有情况中,我们知道当手中没有未开启的房间门的钥匙时我们需要破坏一扇门。在已开启的门中,钥匙作为指示的方向,是房间号码形成了一个环。而针对每种情况,形成的环数就是所要破坏的门的数量。所以要找寻k以内的环数的情况,并且因为1号门不能破坏,所以要减去,以1号门为单独的一个环且符合情况的数量。
1 #include<stdio.h> 2 #include<string.h> 3 typedef long long i64; 4 int main() 5 { 6 i64 s[25][25],f[25]; 7 int T,n,k,i,j; 8 memset(s,0,sizeof(s)); 9 s[1][1]=1; 10 for(i=1;i<=20;i++) 11 for(j=1;j<=i+1;j++) 12 s[i+1][j]=s[i][j-1]+i*s[i][j]; 13 f[1]=1;f[0]=1; 14 for(i=2;i<=20;i++) 15 f[i]=f[i-1]*i; 16 scanf("%d",&T); 17 { 18 while(T--) 19 { 20 scanf("%d%d",&n,&k); 21 i64 p1=0; 22 for(i=1;i<=k;i++) 23 p1+=(s[n][i]-s[n-1][i-1]); 24 printf("%.4lf ",(double)p1/f[n]); 25 } 26 } 27 return 0; 28 }