POJ 1189 钉子和小球
http://poj.org/problem?id=1189
设经过位置(i,j)的小球个数为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; }