题目分析:p=f[n-m]*C(n,m)/(N!).....f[i]为错排数组
化简后为p=(1+求和1~n-m ***(-1)^i/i!)/m!
注意:因为要保留8位小数,所以求阶乘是求到20时,就应该可以过了 ^-^
/*
p=f[n-m]*C(n,m)/(N!)
*/
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,m;
long long arr[21];
arr[0]=1;
arr[1]=1;
for(int i=2;i<=20;i++)
{
long long temp=1;
for(int j=2;j<=i;j++)
temp*=j;
arr[i]=temp;
/*printf("%lld***\n",arr[i]);*/
}
while(scanf("%d %d",&n,&m)!=EOF)
{
double ans=1;
if(m<=20)
{
if(n-m<=20)
{
for(int i=1;i<=n-m;i++)
if(i%2==0)
ans+=1.0/arr[i];
else
ans-=1.0/arr[i];
}
else
{
for(int i=1;i<=20;i++)
if(i%2==0)
ans+=1.0/arr[i];
else
ans-=1.0/arr[i];
}
ans/=arr[m];
}
else
{
if(n-m<=20)
{
for(int i=1;i<=n-m;i++)
if(i%2==0)
ans+=1.0/arr[i];
else
ans-=1.0/arr[i];
}
else
{
for(int i=1;i<=20;i++)
if(i%2==0)
ans+=1.0/arr[i];
else
ans-=1.0/arr[i];
}
ans/=arr[20];
}
printf("%.8lf\n",ans);
}
//system("pause");
return 0;
}