標籤:興趣 題解 枚舉 一段 記憶體 組合 begin 工作 第一時間
傳說很久以前,大地上居住著一種神秘的生物:地精。 地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為 N 的山脈 H可分 為從左至右的 N 段,每段有一個獨一無二的高度 Hi,其中Hi是1到N 之間的正 整數。 如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是一個山峰。位於邊 緣的山脈只有一段相鄰的山脈,其他都有兩段(即左邊和右邊)。 類似地,如果一段山脈比所有它相鄰的山脈都低,則這段山脈是一個山穀。 地精們有一個共同的愛好——飲酒,酒館可以設立在山穀之中。地精的酒館 不論白天黑夜總是人聲鼎沸,地精美酒的香味可以飄到方圓數裡的地方。 地精還是一種非常警覺的生物,他們在每座山峰上都可以設立瞭望台,並輪 流擔當瞭望工作,以確保在第一時間得知外敵的入侵。 地精們希望這N 段山脈每段都可以修建瞭望台或酒館的其中之一,只有滿足 這個條件的整座山脈才可能有地精居住。 現在你希望知道,長度為N 的可能有地精居住的山脈有多少種。兩座山脈A 和B不同若且唯若存在一個 i,使得 Ai≠Bi。由於這個數目可能很大,你只對它 除以P的餘數感興趣。
題解:
易證符合條件長度為n的山脈,開頭為峰與開頭為穀的種數是相同的。這樣,我們可以取F[n]的一半來表示某端點為山峰或山穀的方案數。
在求F[n]時,可以考慮在長度為n-1的山脈中插入高度為n的山峰,枚舉插入的位置,則兩邊離散化後都變成了子問題,可以進行動態規劃。因為兩邊的組成有多種情況,乘上一個組合數即可。
使用楊輝三角求組合數。注意記憶體限制,需使用滾動數組。
代碼:
var i,j,k,l,n,m,p:longint; a:array[0..4201]of int64; c:array[1..2,0..4201]of longint;begin readln(n,p); c[1,1]:=1; c[1,0]:=1; a[1]:=1; a[0]:=1; for i:=2 to n do begin for j:=1 to i do if j mod 2=1 then a[i]:=(a[i]+(a[j-1]*c[1,j-1]mod p)*a[i-j])mod p; c[2,0]:=1; c[2,i]:=1; for j:=1 to i-1 do c[2,j]:=(c[1,j]+c[1,j-1])mod p; for j:=1 to i do c[1,j]:=c[2,j]; end; writeln(a[n]*2 mod p);end.
BZOJ1925地精部落