题目分析: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; }