1. 程式人生 > >bzoj1925: [Sdoi2010]地精部落 [dp]

bzoj1925: [Sdoi2010]地精部落 [dp]

include ios 居住 stream () www str html script

Description

傳說很久以前,大地上居住著一種神秘的生物:地精。 地精喜歡住在連綿不絕的山脈中。具體地說,一座長度為 N 的山脈 H可分 為從左到右的 N 段,每段有一個獨一無二的高度 Hi,其中Hi是1到N 之間的正 整數。 如果一段山脈比所有與它相鄰的山脈都高,則這段山脈是一個山峰。位於邊 緣的山脈只有一段相鄰的山脈,其他都有兩段(即左邊和右邊)。 類似地,如果一段山脈比所有它相鄰的山脈都低,則這段山脈是一個山谷。 地精們有一個共同的愛好——飲酒,酒館可以設立在山谷之中。地精的酒館 不論白天黑夜總是人聲鼎沸,地精美酒的香味可以飄到方圓數裏的地方。 地精還是一種非常警覺的生物,他們在每座山峰上都可以設立瞭望臺,並輪 流擔當瞭望工作,以確保在第一時間得知外敵的入侵。 地精們希望這N 段山脈每段都可以修建瞭望臺或酒館的其中之一,只有滿足 這個條件的整座山脈才可能有地精居住。 現在你希望知道,長度為N 的可能有地精居住的山脈有多少種。兩座山脈A 和B不同當且僅當存在一個 i,使得 Ai≠Bi。由於這個數目可能很大,你只對它 除以P的余數感興趣。

Input

僅含一行,兩個正整數 N, P。

Output

僅含一行,一個非負整數,表示你所求的答案對P取余 之後的結果。

Sample Input

4 7

Sample Output

3

HINT


技術分享
對於 20%的數據,滿足 N≤10;
對於 40%的數據,滿足 N≤18;
對於 70%的數據,滿足 N≤550;
對於 100%的數據,滿足 3≤N≤4200,P≤109


我是不會寫題解啦?

我當然不懂得寫題解啦。。

供上一位大佬的題解。。

 1 /**************************************************************
2 Problem: 1925 3 User: ZYBGMZL 4 Language: C++ 5 Result: Accepted 6 Time:228 ms 7 Memory:1320 kb 8 ****************************************************************/ 9 10 #include<cstdio> 11 #include<cstring> 12 #include<iostream> 13 using namespace
std; 14 15 const int maxn=4205; 16 17 int n,mod,ans=0,s; 18 int dp[2][maxn]; 19 bool pos=1; 20 21 int main(){ 22 scanf("%d%d",&n,&mod); 23 dp[1][1]=1; 24 for(int i=2;i<=n;i++){ 25 pos^=1; 26 memset(dp[pos],0,sizeof dp[pos]); 27 s=0; 28 for(int j=i-1;j;j--){ 29 s=(s+dp[pos^1][i-j])%mod; 30 dp[pos][j]=s; 31 } 32 } 33 for(int i=1;i<=n;i++) 34 ans=(ans+dp[pos][i])%mod; 35 printf("%d\n",(ans<<1)%mod); 36 return 0; 37 }

bzoj1925: [Sdoi2010]地精部落 [dp]