POJ 1189 钉子和小球

http://poj.org/problem?id=1189

设经过位置(ij)的小球个数为P(i, j),那么落入格子m的小球个数为p(n+1, m),那么概率就是p(n+1,m)/2^n

假设位置(i,j)有铁钉,那么各有p(i, j)/2个小球落入位置(i+1, j)和位置(i+1, j+1);否则球全部落入(i+2, j+1)的位置。

代码如下:

View Code
/*

POJ 1189钉子和球

*/ 

#include<stdio.h>

#include<string.h>

#include<iostream>

using namespace std;

long long powx(int x)

{

     int i;

     long long pp=1;

     for(i=1; i<=x; i++)

        pp*=2;

     return pp;

}

int main()

{

    int i, j, n, m;

    long long f[55][55];

    char ch[52][52];

    while(cin>>n>>m)

    {

        memset(f, 0, sizeof(f));

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

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

                cin>>ch[i][j];

        f[1][0]=powx(n);

        long long nn=f[1][0];

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

            for(j=0; j<=i-1; j++)

            {

                if(ch[i][j]=='*')

                {

                    f[i+1][j]+=f[i][j]/2;

                    f[i+1][j+1]+=f[i][j]/2;

                }

                else

                    f[i+2][j+1]+=f[i][j];

            }

        while(f[n+1][m]%2==0)

        {

            nn/=2;

            f[n+1][m]/=2;

        }

        printf("%lld/%lld\n", f[n+1][m], nn);

    }

    return 0;

}

 

posted on 2013-03-02 09:49  crying_Dream  阅读(232)  评论(0编辑  收藏  举报