AHOI2012 樹屋階梯 題解(卡特蘭數)

2022-08-03 23:21:30 字數 928 閱讀 2758

暑假期間,小龍報名了乙個模擬野外生存作戰訓練班來鍛鍊體魄,訓練的第乙個晚上,教官就給他們出了個難題。由於地上露營濕氣重,必須選擇在高處的樹屋露營。小龍分配的樹屋建立在一顆高度為n+1尺(n為正整數)的大樹上,正當他發愁怎麼爬上去的時候,發現旁邊堆滿了一些空心四方鋼材(如圖1.1),經過觀察和測量,這些鋼材截面的寬和高大小不一,但都是1尺的整數倍,教官命令隊員們每人選取n個空心鋼材來搭建乙個總高度為n尺的階梯來進入樹屋,該階梯每一步台階的高度為1尺,寬度也為1尺。如果這些鋼材有各種尺寸,且每種尺寸數量充足,那麼小龍可以有多少種搭建方法?(注:為了避免夜裡踏空,鋼材空心的一面絕對不可以向上。)

1.我們發現對於任何大小為i的樹屋階梯,都可以由左上角放一塊大小為j的以及右下角放一塊大小為(i−j−1)的樹屋階梯,再在空缺的地方由單個大塊的矩形填充即可構成,那麼這個構成的樹屋階梯一共有 j+(i−j−1)+1個鋼材,正好是i個。

2.因為j可以在 0 到 i−1取且可以證明每乙個構成的樹屋階梯一定各不相同,所以我們可以得到樹屋階梯方案與大小關係的遞推式c[n]=σ(0≤k3.我們發現這就是n對應的卡特蘭數,輸出n對應的卡特蘭數就好,因為沒有要求取模,考慮使用高精度;

#include#include#include#include#includeusing namespace std;

int ans[100001]={},x=0;

void mul(int n)

while(x>0)

}void div(int n)

while(ans[ans[0]]==0)ans[0]--;

}int main()

卡特蘭數基礎知識部分可以參考我的題解:

AHOI2012 樹屋階梯

卡特蘭數!至於為什麼是卡特蘭數,就稍微說那麼一兩句吧 對於乙個高度為 i 的階梯,我們可以在左上角填乙個高度為 k 的階梯,右下角填乙個高度為 i 1 k 的階梯剩下的我們用乙個大的長方形填上就可以啦 比如這個樣子 之後還需要高精,但是為了簡單好寫,這裡可以分解質因數,之後就變成另乙個單精度乘高精了...

AHOI2012 樹屋階梯

有無窮多的任意尺寸矩形,搭建乙個 n 級正階梯有多少種方案?任意大小為 i 的階梯,都可以由左上角放一塊大小為 j 的,右下角放一塊大小為 i j 1 的來構成,每一塊內部遞迴填充,對應 catalan 數 實現需要高精乘單精,高精除單精 include using namespace std co...

2822 AHOI2012 樹屋階梯

time limit 1 sec memory limit 128 mb submit 729 solved 424 submit status discuss 暑假期間,小龍報名了乙個模擬野外生存作戰訓練班來鍛鍊體魄,訓練的第 乙個晚上,教官就給他們出了個難題。由於地上露營濕氣重,必須選擇在高處的...