僅含一行,兩個正整數 n, p。
僅含一行,乙個非負整數,表示你所求的答案對p取餘 之後的結果。
4 73
太神仙了
讀完題急切地想寫暴搜
之後改記憶化搜尋 嘗試使用bitset
看一眼範圍發現根本不可做
對著題解瞪了20min感覺要死了
首先這題是要求長度為n的波動序列的方案數%p對吧
關於波動序列的性質:
引理一:乙個抖動序列的連續子串行(≈乙個數列的子串?)仍然是抖動序列。其實都挺顯然的……就不證了……引理二:若乙個抖動排列中$x$與$x+1$不相鄰,那麼交換$x,x+1$ 序列仍滿足抖動。
引理三:若使乙個抖動排列中大於等於$x$的元素全部$+1$,序列仍滿足抖動。
引理四:乙個$[1,x]$的抖動序列一定可以對應到$[y-x+1,y]$的乙個抖動序列。
規定f[i][j]的含義為在[1,i]的排列中第乙個數大於第二個數時的方案數
根據引理4進行交換 第乙個數為峰和為谷的情況相同 最終答案為$\sum_^*2$
第乙個數已經確定,考慮第二個數
1.不是j-1。
根據引理2,我們可以交換j與j-1且序列性質不變(仍抖動),方案數為$f[i][j-1]$.
2.是j-1。
(因為博主不會了所以就……)
轉移方程$f[i][j]=f[i][j-1]+f[i-1][i-j+1]$
思維量和**量的反差簡直……
或許神題都是這樣的吧?
upd:lrefrain 10min切掉了這道題。
#include#include#include
using
namespace
std;
const
int n=4500
;int n,p,f[3
][n],ans;
intmain()
f[0][2]=1;int now=0
;
for(int i=3;i<=n;i++)
for(int i=1;i<=n;i++)
(ans+=f[now][i])%=p;
cout
<2%p<
return0;
}
SDOI2010 地精部落
求1 n的全排列數目,使得對於 i geq 3 a a 的大小關係與 a a 的大小關係不同 題目還有另外一種格式 求一種全排列,使得這個排列要麼滿足奇數項的高度比相鄰位置都大,要麼滿足偶數項的高度比相鄰位置都大.設 dp 表示用了前 i 個數字,a 1 j 且 a 1 a 2 時的方案數 有乙個神...
SDOI2010 地精部落
這道題是一道 dp 題,思維難度比較大。題意 先定義波形陣列 滿足當 i 全為奇數或偶數時,a i a i 1 且 a i a i 1 求 n 的全排列中有多少個符合波形陣列。我們記錄狀態為 f i j 0 1 i 為剩下 i 個數,j 表示有 j 1 個數小於剛剛選擇的數,當第 3 個下標為 0 ...
SDOI2010 地精部落
sdoi2010 地精部落 僅含一行,兩個正整數 n,p。僅含一行,乙個非負整數,表示你所求的答案對p取餘 之後的結果。4 7對於 20 的資料,滿足 n 10 對於 40 的資料,滿足 n 18 對於 70 的資料,滿足 n 550 對於 100 的資料,滿足 3 n 4200,p 109 我覺得...