错位排列数D[n]=n!【1-1/1!+1/2!-......+(-1)^n*1/n!】;
可以知道D[n]是满需以下两条的:
(1)D[1]=0;D[2]=1;即只有一个人的情况,他的错排数为0,两个人时只有一种错排可能。
(2)D[n]=(n-1)(D[n-1]+D[n-2]);
对于n>2的情况可以分两步来考虑:
第一步,我们把第一个位置上的数放到剩下的n-1个位置当中的一个,有(n-1)种方法数;
第二步,我们假设第一个元素放在了第k个位置上,那么对于第k个元素来说,我们可以把它分成两种情况:
(1)我们把第k个元素放在1号位置上,那么问题就变成了把剩下的n-2个元素错位排列,即D(n-2);
(2)如果第k个元素不放在1号元素的位置上,我们把第k个位置和第一个位置交换一下,那么问题就变成,第一个位置已经错误排列,剩下n-1个元素(包括第k个元素)的错排,有D(n-1)种方法数;
根据加法原理,D(n)=(n-1)*(D(n-1)+D(n-2))。
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int i,t,n;
long long f[25],sum;
f[1]=0;
f[2]=1;
for(i=3;i<=20;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
cin>>t;
while(t--)
{
scanf("%d",&n);
sum=1;
for(i=1;i<=n;i++)
sum*=i;
printf("%.2f%c\n",(double)f[n]*100/sum,'%');
}
return 0;
}