#include <stdio.h>
int main()
{
int c,n;
long long int a[1000];
long long int b[1000];
double ans;
b[1]=1;
a[2]=1;
a[3]=2;
while(scanf("%d",&c)!=EOF)
{
while(c--)
{
scanf("%d",&n);
for(int i=4;i<=n;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);//拿错的可能种数
}
for (int i=2;i<=n;i++)
{
b[i]=b[i-1]*i;//总可能数
}
ans=(100.0*a[n])/b[n];
printf("%.2f%%\n",ans);
}
}
return 0;
}
已AC
a[2],a[3]很容易就能推出来。。。
然后a[4]之后。就像是在编号1-n的盒子中放编号1-n的小球并且小球的编号不能与盒子的编号相等,每增加一个小球,n球不能在n盒,所以之前的盒子中选出一个,可能性是n-1,,假设这个盒子是k,把k球与n球互换,剩下的n-2个球乱排就是a[n-2],所以这一种情况总的可能数是(n-1)*a[n-2] ,如果不把k球放n盒中,即n盒等效为k盒,那么剩下的n-1个球乱排,总可能数就是(n-1)*a[n-1],而k球要么放n盒要么不放n盒,所以a[n]=n-1*(a[n-1]+a[n-2]),
总可能数很容易推出来是n!。