BZOJ1925: [Sdoi2010]地精部落
阿新 • • 發佈:2017-09-05
problem 之一 out ges sub 排名 sdoi2010 mem reg
Submit: 1442 Solved: 902
[Submit][Status][Discuss]
僅含一行,兩個正整數 N, P。
1925: [Sdoi2010]地精部落
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1442 Solved: 902
[Submit][Status][Discuss]
Description
傳說很久以前,大地上居住著一種神秘的生物:地精。 地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為 N 的山脈 H可分 為從左到右的 N 段,每段有一個獨一無二的高度 Hi,其中Hi是1到N 之間的正 整數。 如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是一個山峰。位於邊 緣的山脈只有一段相鄰的山脈,其他都有兩段(即左邊和右邊)。 類似地,如果一段山脈比所有它相鄰的山脈都低,則這段山脈是一個山谷。 地精們有一個共同的愛好——飲酒,酒館可以設立在山谷之中。地精的酒館 不論白天黑夜總是人聲鼎沸,地精美酒的香味可以飄到方圓數裏的地方。 地精還是一種非常警覺的生物,他們在每座山峰上都可以設立瞭望臺,並輪 流擔當瞭望工作,以確保在第一時間得知外敵的入侵。 地精們希望這N 段山脈每段都可以修建瞭望臺或酒館的其中之一,只有滿足 這個條件的整座山脈才可能有地精居住。 現在你希望知道,長度為N 的可能有地精居住的山脈有多少種。兩座山脈A 和B不同當且僅當存在一個 i,使得 Ai≠Bi。由於這個數目可能很大,你只對它 除以P的余數感興趣。Input
Output
僅含一行,一個非負整數,表示你所求的答案對P取余 之後的結果。Sample Input
4 7Sample Output
3HINT
對於 20%的數據,滿足 N≤10;
對於 40%的數據,滿足 N≤18;
對於 70%的數據,滿足 N≤550;
對於 100%的數據,滿足 3≤N≤4200,P≤109
思路{
高度獨一無二,那麽直接枚舉第i位數是多少計算方案明顯不對.
發現在過程中排名不變不如設第i位排名為j的方案為多少.
在推導過程中用兩種數組記錄分別山峰,山谷的轉移,
發現這個是可以互換的,將其中一個代入另外一個,就得到了轉移方程!
}
#include<bits/stdc++.h> #define RG register #define il inline #define N 4210 #define LL long long using namespace std; LL dp[2][N],n,mod,sum[N]; int main(){ scanf("%lld%lld",&n,&mod); int now(0); dp[now][1]=1; for(int i=2;i<=n;++i){ now^=1; for(int j=1;j<=i;++j)sum[j]=sum[j-1]+dp[now^1][j],sum[j]%=mod; for(int j=1;j<=i;++j)dp[now][j]=sum[i-j]; }LL Ans(0);for(int i=1;i<=n;++i)Ans+=dp[now][i],Ans%=mod; Ans<<=1;cout<<Ans%mod; return 0; }
BZOJ1925: [Sdoi2010]地精部落