hdu 4159 Indomie (DP,数学概率)

推出数学公式:

#include<stdio.h>

#include<string.h>

__int64 C(int m,int n)

{

    __int64 tmp=1;

    if(m>(n-m))m=n-m;

    for(int i=1; i<=m; i++)

    {

        tmp*=(n--);

        tmp/=i;

    }

    return tmp;

}

int main()

{

    int n,s;

    int i,j,k;

    //printf("#%I64d\n",C(10,50));

    while(scanf("%d%d",&n,&s)!=EOF)

    {

        double sum=0,tsum;

        if(s>n)

        {

            printf("100.00000\n");

            continue;

        }

        if(s==0)

            printf("0.00000\n");

        else

        {

            for(i=0; i<=s; i++)

            {

                sum+=(double)C(i,n)*((__int64)1<<(n-i));

                if(i==s-1) tsum=sum;

            }

            printf("%.5lf\n",100.0*tsum/sum);

        }

    }

    return 0;

}

 

反面推出数学公式(超__int64):

#include<stdio.h>

#include<math.h>



__int64 C(int m,int n)

{

    __int64 tmp=1;

    if(m>(n-m))m=n-m;

    for(int i=1;i<=m;i++)

    {

        tmp*=(n--);

        tmp/=i;

    }

    return tmp;

}

__int64 Sum(int n,int s)

{

    __int64 tmp=0,ret=1;

    for(int i=0;i<n-s;i++)

    {

        tmp+=(C(i,n)*ret);

        ret*=2;

    }

    return tmp;

}

int main()

{

    int n,s;

    //printf("%d",C(25,50));

    while(scanf("%d%d",&n,&s)!=EOF)

    {

        if(n<s)

        {

            printf("100.00000\n");

            continue;

        }

        if(s==0)printf("0.00000\n");

        else

        {

            //printf("%lf\n",pow(3,n));

            printf("%.5lf\n",100-100.0*C(s,n)*pow(2,n-s)/(pow(3,n)-Sum(n,s)));

        }

    }

    return 0;

}
View Code

 

Dp解法:

转载:

//f(a,b)=2*f(a-1,b)+f(a-1,b-1)是公式

#include<stdio.h>

double p[51][51],o[51][51],k[51][51];

int main()

{

    int a,b,c,d;

    p[1][0]=2;p[1][1]=3;

    for(a=1;a<=50;a++)

    {

        o[a][0]=0;

        o[1][a]=2;

    }

    for(a=2;a<=50;a++)

    {

        p[a][0]=2*p[a-1][0];

        p[1][a]=3;

    }

    for(a=2;a<=50;a++)

    for(b=1;b<=50;b++)

    {

        p[a][b]=2*p[a-1][b]+p[a-1][b-1];

    }

   for(a=2;a<=50;a++)

    for(b=1;b<=50;b++)

    {

        if(b>=a)

        o[a][b]=3*p[a-1][b-1]-1;

        else

        o[a][b]=2*o[a-1][b]+o[a-1][b-1];

    }

    for(a=1;a<=50;a++)

    for(b=1;b<=50;b++)

    {

        k[a][b]=o[a][b]/p[a][b]*100;

    }

    while(scanf("%d%d",&a,&b)!=EOF)

    {

     if(b>a)

     printf("100.00000\n");

     else

    printf("%.5lf\n",k[a][b]);

    }

    return 0;

}
View Code

 

#include<stdio.h>

#include<string.h>

#define MM 1000000000000000.0

double dp[55][55];

int main()

{

    int n,s,i,j;

    while(scanf("%d%d",&n,&s)!=EOF)

    {

        memset(dp,0,sizeof(dp));

        if(s==0)

        {

            printf("0.00000\n");

            continue;

        }

        dp[1][s] = 2;

        dp[1][s-1] = 1;

        for(i = 2; i <= n ; i++)

            for(j = 0 ; j <= s ; j++)

            {

                dp[i][j] = dp[i-1][j]*2+dp[i-1][j+1];

            }

        double ss=0;

        for(i = 0; i <= s ; i++)

        {

            ss+=dp[n][i]/MM;

        }

        dp[n][0] = dp[n][0]/MM;

        double x = 1-1.0*dp[n][0]/ss;

        printf("%.5lf\n",x*100);

    }

    return 0;

}
View Code

 

 

你可能感兴趣的:(dom)