SDOI2010 地精部落 題解

2022-03-16 16:57:34 字數 1236 閱讀 2712

僅含一行,兩個正整數 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 我覺得...