现在的位置: 首页 > 综合 > 正文

zoj 1619 Present(错排公式的简单应用)

2017年11月16日 ⁄ 综合 ⁄ 共 786字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.