#include <stdio.h>
#include <stdlib.h>
int main()
{
int c,i,n;
char a='%';
long long s[21];
double q;
s[1]=0;
s[2]=1;
for(i=3;i<=21;i++){
s[i]=(s[i-1]+s[i-2])*(i-1);
}
scanf("%d",&c);
while(c--){
scanf("%d",&n);
long long k=1;
for(i=1;i<=n;i++){
k=k*i;
}
q=s[n]*100.0/k;
printf("%.2lf",q);
printf("%c\n",a);
}
return 0;
}
这个题当时推了很久不会,然后上网搜,说用错排公式,就去百度了一发。公式推导也很好理解
将第n个元素放在第k个位置,则有n-1个这样的位置。
第k个元素如果放在第n个位置,则这两个元素位置已确定,只考虑剩下的n-2个元素
第k个位置如果不放在n处,为了保证k不放在n处,将这n-1个元素进行错排