#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!。