ZJOI2010 排列計數

2022-03-16 23:58:19 字數 653 閱讀 5299

求1~n的全排列\(p_i\)的個數,滿足對於\(i\geq 2\),有\(p_i > p_\)

隨手畫個圖就可以發現問題是求大小為\(n\)的小根堆的個數

由於左右子樹互不影響,直接dp即可,設\(dp_\)表示以\(i\)為根的小根堆的個數,有\(dp_i = dp_ * dp_ * c(size_i - 1 , size_)\)

注意本題模數可能小於\(n\),所以要用\(lucas\)定理求組合數

#include#define n 2000005

#define min(x,y) ((x)<(y)?(x):(y))

using namespace std;

typedef long long ll;

int n,size[n];

ll mod;

ll jc[n],inv[n],dp[n];

ll quickpow(ll a,ll b)

return ret;

}void init()

ll c(int n,int m)

ll lucas(int n,int m)

void dfs(int rt)

void dfs(int rt)

int main()

ZJOI2010 排列計數

不是很懂為什麼洛谷上這題標籤有數字dp,於是我被騙來做這道題。不過上一道題也是一樣,其實也是組合數學。題意其實是求1.n1.n 1.n 的排列中有多少個可以構成小根堆。f i f i f i 表示以i ii為根的樹的方案數,l,r l,rl,r是左,右子樹結點個數,那麼有 f i f l f r c...

ZJOI2010 排列計數

注意觀察題目 pi pi 2 發現特別像什麼?二叉堆!於是就變成了 n 個堆元素進行排列,滿足堆性質的排列對 p 的取模。堆性質根據題意為大根堆 設 f i 為當前堆首為 i 的堆的排列方案數。為滿足堆性質 p i 顯然只能取剩下若干數的最大值。發現 f i 影響 f 和 f 兩個結點。以 i 為根...

ZJOI2010 排列計數

稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出檔案中僅包含乙個整數,表示計算1,2,的排列中,magic排列的個數模 ...