杭电2048题
//思路:主要使用错排公式
//d[1] = 0 d[2] = 1 d[n] = (n-1)*(d[n-1]+d[n-2])
#include <iostream>
using namespace std;
__int64 fun(int n);
int main()
{
int case_num;
cin>>case_num;
for(int i=0;i<case_num;i++)
{
int n;
cin>>n;
//使用__int64
__int64 *p = new __int64[n+1];
p[1] = 0;
p[2] = 1;
for(int j = 3;j<n+1;j++)
{
p[j] = (j-1)*(p[j-1] + p[j-2]);
}
//输出百分号的方法
printf("%.2f%%\n",100.0*p[n]/fun(n));
delete []p;
}
return 0;
}
__int64 fun(int n)
{
__int64 result;
if(n==1)
return 1;
else
{
result = n*fun(n-1);
}
return result;
}