傳說很久以前,大地上居住著一種神秘的生物:地精。
地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為n的山脈h可分為從左到右的n段,每段有乙個獨一無二的高度hi,其中hi是1到n之間的正整數。
如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是乙個山峰。位於邊緣的山脈只有一段相鄰的山脈,其他都有兩段(即左邊和右邊)。
類似地,如果一段山脈比所有它相鄰的山脈都低,則這段山脈是乙個山谷。
地精們有乙個共同的愛好——飲酒,酒館可以設立在山谷之中。地精的酒館不論白天黑夜總是人聲鼎沸,地精美酒的香味可以飄到方圓數里的地方。
地精還是一種非常警覺的生物,他們在每座山峰上都可以設立瞭望台,並輪流擔當瞭望工作,以確保在第一時間得知外敵的入侵。
地精們希望這n段山脈每段都可以修建瞭望台或酒館的其中之一,只有滿足這個條件的整座山脈才可能有地精居住。
現在你希望知道,長度為n的可能有地精居住的山脈有多少種。兩座山脈a和b不同當且僅當存在乙個i,使得ai≠bi。由於這個數目可能很大,你只對它除以p的餘數感興趣。
輸入格式:
輸入檔案goblin.in僅含一行,兩個正整數n, p。
輸出格式:
輸出檔案goblin.out僅含一行,乙個非負整數,表示你所求的答案對p取餘之後的結果。
輸入樣例#1:
4 7輸出樣例#1:
3
【資料規模和約定】
對於20%的資料,滿足n≤10;
對於40%的資料,滿足n≤18;
對於70%的資料,滿足n≤550;
對於100%的資料,滿足3≤n≤4200,p≤1e9。
題解
好題……思維難度省選,**難度普及-……
大佬真厲害
首先先弄清楚三個性質
$$性質一:在乙個波動序列中,如果數字i與i+1不相鄰,那麼交換i與i+1,得到的仍然是乙個波動序列$$
$$證明:若i為山峰,交換後i+1必然也為山峰。同理,若i+1為山谷,交換後i也必為山谷$$
$$若i為山谷,因為i+1與i不相鄰,所以i兩邊的高度都大於i+1,所以交換後i+1小於其兩邊,仍為山谷。同理,若i+1為山峰,交換後i也為山峰$$
$$性質二:把波動序列中的每乙個數i換成n+1-i,得到的仍是乙個波動序列$$
$$證明:原來是山峰的地方變為山谷,原來是山谷的地方便為山峰,仍是波動序列$$
$$性質三:波動序列具有對稱性,即將乙個波動序列翻轉後仍是波動序列$$
$$證明:正確性顯然$$
於是就可以考慮如何寫狀態轉移方程了。設$f[i][j]$表示選了$1$到$i$的數,$j$為第乙個數,且$j$為山峰
很明顯答案為$\sum_^n f[n][i]$
如何轉移?
先給出方程:$f[i][j]=f[i][j-1]+f[i-1][i-j+1]$
首先,因為由性質一可知,當$j$與$j-1$不相鄰時,$j$作為第乙個數和$j-1$作為第乙個數的方案數相同
又因為$j-1$為山峰,且是第乙個數,故$j$與$j-1$必定不相鄰
然後,我們來考慮$j$和$j-1$相鄰的情況
選了$j$為山峰,則第二個數$j-1$必然為山谷,後面的數為$[1,j-1]$和$[j+1,i]$
問題轉變為求$i-1$個數,$j-1$為開頭的山谷的方案數
由性質二可得,$j-1$作為山峰和山谷的方案數相同
又因為山峰和山谷是相對位置關係,所以將$[j+1,i]$區間每乙個數減一,對方案無影響
於是我們加上$f[i-1][(i-1+1)-(j-1)]$即可
解決了ps:**難度和思維難度真心不成正比……
1//minamoto
2 #include3
#define n 5005
4#define inf 0x3f3f3f3f
5using
namespace
std;
6#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<15,stdin),p1==p2)?eof:*p1++)
7char buf[1
<<15],*p1=buf,*p2=buf;
8 inline int
read()
18int n,mod,f[2
][n];
19int
main()
bzoj1925 Sdoi2010 地精部落
題目大意 求全排列中鋸齒狀排列的個數。首先進行打表暴力,會發現第乙個元素作為山峰和第乙個元素作為山谷,這兩種方案數是相等的,因此我們只需求出第乙個元素是山谷的方案數再乘2就是答案。做法一 f i 表示i的全排列,第乙個元素時山谷時,鋸齒狀排列的方案數。那麼考慮在i 1的乙個鋸齒狀排列中插入i這個數,...
bzoj1925 Sdoi2010 地精部落
傳送門 我們設f i j 表示前i個數,第i個數排名是j的方案總數。我們可以強制第1個數是山峰。然後我們可以將整個序列高度取反,得到其他的方案數。然後我們發現這樣做的時間複雜度是o n 3 的 加上字首和優化就是o n 2 了 var f array 0.1,0.5005 of longint n,...
bzoj1925 SDOI2010 地精部落
問1到n的排列中有多少個是 抖動 的.即 滿足所有奇數字置的數字都比相鄰兩個數字小或者都比相鄰兩個數字大.定義f i j 表示長度為i,第乙個元素為j,且第乙個元素大於第二個元素的所有排列中,抖動排列 的數目.g i j 表示長度為i,第乙個元素為j,且第乙個元素小於第二個元素的所有排列中,抖動排列...