X-man

导航

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

 

 

posted on 2013-10-07 14:47  雨钝风轻  阅读(310)  评论(0编辑  收藏  举报