題目描述
輸入格式
僅含一行,兩個正整數 n,p。
輸出格式
僅含一行,乙個非負整數,表示你所求的答案對p取餘之後的結果。
樣例樣例輸入
4 7
樣例輸出
3
資料範圍與提示
對於 20%的資料,滿足 n≤10;
對於 40%的資料,滿足 n≤18;
對於 70%的資料,滿足 n≤550;
對於 100%的資料,滿足 3≤n≤4200,p≤10^99
反正信奧題把誰都能搞進來
這是我做數論這幾天碰到的第乙個**這麼短的題,那就靠腦子了
因為最近學組合數,我就去往組合數上想去了,誰知道這是個考數列的dp題,我數學老師也沒給我講過擺動數列啊,那就先看看樣例裡的說明,你看上下兩行是不是長得有點像,你吧上面那一行的倒過來你發現了什麼?都一樣,這提示我們可以算出一半來乘二就可以了
1.對於乙個符合條件的數列,如果有兩個數$a_i$和$a_j$,$|a_i-a_j|=1$並且$a_i$和$a_j$在數列中不相鄰,那麼對於乙個已經成立的數列,把$a_i$和$a_j$交換位置,整個數列依舊可以成立
再回來的我已經是考過一場數論,打了兩個數論暴搜的人了
證明:對於滿足要求的$a_i$和$a_j$設其兩邊的兩個數分別為a,b,c,d(a,d可能為零),且$a_i$為山峰,$a_j$為山谷(其他的情況模擬證明就行了),保證數列中均為整數
則有$a$,$ba_i-2$,$c$,$da_j+2$
若$a_i>a_j$,則有$a_i=a_j+1$,$a_j=a_i-1$,可知$a$,$ba_j-1$,$c$,$da_i+1$,數列仍成立,證畢($a_i2.如果數列$a_1$,$a_2$,$$,$a_n$為乙個符合條件的數列,那麼$n-a_1+1$,$n-a_2+1$,$$,$n-a_n+1$仍符合條件,且峰谷相反
這個我覺得沒什麼證明的,就是大小關係直接取反了
有了這兩個性質我們回到這道題上,設$f[i][j]$表示在前i個數中以$j$為最後乙個數,且$j$為山峰時的符合條件的方案數,我們考慮兩種情況
$j$和$j-1$不相鄰
那性質一就派上用場了,既然不相鄰,$j$為最後乙個且為峰和$j-1$為最後乙個且為峰是一樣的,那麼$f[i][j]=f[i][j-1]$
$j$和$j-1$相鄰
這個時候就用到性質二了,$j$為山峰,那$j-1$就是山谷,$f[i][j]$就等於在前$i-1$個數中$j-1$為山谷的方案數,我們不知道山谷怎麼辦?全部翻轉,谷變峰,峰變谷,那最後就是前$i-1$個數,以$(i-1)-(j-1)+1$為最後乙個數且為峰,則$f[i][j]=f[i][i-j+1]$
綜上所述$f[i][j]=f[i][j-1]+f[i][i-j+1]$
這道題就搞定了,注意1不能當結尾就可以了
1 #include2 #include3#define ll long long
4#define maxn 4300
5using
namespace
std;
6int
n,p;
7ll f[maxn][maxn];
8int
main()919
}20 ll ans=0;21
for(int i=2;i<=n;++i)
2226 ans=(ans*2)%p;
27 printf("
%lld\n
",ans);
28return0;
29 }
BZOJ 1925 地精部落 DP
description 僅含一行,兩個正整數 n,p。output 僅含一行,乙個非負整數,表示你所求的答案對p取餘 之後的結果。sample input 4 7 sample output 3 hint 對於 20 的資料,滿足 n 10 對於 40 的資料,滿足 n 18 對於 70 的資料,滿...
BZOJ 1925 地精部落 DP
其實不要小看一道地精部落,有比較大的思維量在裡面!我們首先知道 3 個性質 如果有想看證明的,請自動轉到 片下面,因為考慮有些人不想看證明 fi rst fir st 對於每乙個 數字 i 和 i 1 如果這兩個數不是相鄰的,那麼交換兩個數字的對應的方案數是一樣的!比如有 波動序列 32 415 3...
BZOJ 1925地精部落題解
題目鏈結 一道神仙題,有很多思考的方式,這裡選擇最好理解的一種來講 我們將序列分為兩種,一種開頭遞增,一種開頭遞減,顯然這兩種序列的數目是一樣的 現在我們只用考慮開頭遞增的情況 f i j 表示前i個數,最後乙個數字在前i個數的排名在1 j之間的方案數 顯然有f i j f i j 1 如果最後乙個...