有乙個三角形木板,豎直立放,上面釘著n(n+1)/2顆釘子,還有(n+1)個格仔(當n=5時如圖1)。每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。
讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到乙個釘子都可能落向左邊或右邊(概率各1/2),且球的中心還會正對著下一顆將要碰上的釘子。例如圖2就是小球一條可能的路徑。
我們知道小球落在第i個格仔中的概率pi=
現在的問題是計算拔掉某些釘子後,小球落在編號為m的格仔中的概率pm。假定最下面一排釘子不會被拔掉。例如圖3是某些釘子被拔掉後小球一條可能的路徑。
輸入:第1行為整數n(2<=n<=50)和m(0<=m<=n)。以下n行依次為木板上從上至下n行釘子的資訊,每行中『*』表示釘子還在,『.』表示釘子被拔去,
注意在這n行中
空格符可能出現在
任何位置。
輸出:僅一行,是乙個既約分數(0寫成0/1),為小球落在編號為m的格仔中的概率pm
分析
設三角形有n行,第i行(1<=i<=n)有i個鐵釘位置,其編號為0..i-1;第n+1行有n+1個鐵釘位置,排成n+1個格仔,編號為0..n。設經過位置(i,j)的小球個數為pi,j,則落入格仔m的小球個數為pn+1,m,問題要求的是pn+1,m /2n。
假設位置(i,j)有鐵釘,則各有pi,j /2個小球落入位置(i+1,j)和位置(i+1,j+1);否則pi,j 個小球將全部落入位置(i+2,j+1)。
可得如下演算法:
p1,0 ← 2n ;
for i←1 to n do
for j←1 to n do if 位置(i,j)有釘子 then
else pi+2,j+1← pi+2,j+1 + pi,j ;
問題求的是既約分數,因為分母為2的次冪,因此可把分子、分母同時約去2的因子,直至分子不能整除2。
很奇怪的是為什麼我用_int64沒能通過,然後改為long long ,發現還有re,想到陣列太小了,把sum[50][50]改為sum[51][51]。很幸運只要三次就通過了。
#includeusing namespace std;
char sum[51][51];
long long numod[52][52];
long long funp(int n,int m ) //設經過位置(i,j)的小球個數為pi,j
} long long sumn=funp(n+1,m);// 求出落入m號格仔的球的個數
//求出概率
for(i=0,t=1;i
t*=2;
while(sumn%2==0 && t%2==0)
//輸出結果
printf("%lld/%lld\n",sumn,t);
return 0;
}
poj 1189 釘子和小球
題目大意 乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球...
poj 1189 釘子和小球 一道有趣的題
一道有趣的題,不算難。題目 description 有乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小...
NOI1999 釘子和小球(BSOI1477)
有乙個三角形木板,豎直立放,上面釘著n n 1 2顆釘子,還有 n 1 個格仔 當n 5時如圖1 每顆釘子和周圍的釘子的距離都等於d,每個格仔的寬度也都等於d,且除了最左端和最右端的格仔外每個格仔都正對著最下面一排釘子的間隙。讓乙個直徑略小於d的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到乙...