稱乙個1,2,...,n的排列p1,p2...,pn是magic的,當且僅當2<=i<=n時,pi>pi/2. 計算1,2,...n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值
輸入檔案的第一行包含兩個整數 n和p,含義如上所述。
輸出檔案中僅包含乙個整數,表示計算1,2,⋯, ���的排列中, magic排列的個數模 p的值。
20 23100%的資料中,1 ≤n ≤ 10^6, p≤ 10^9,p是乙個質數。
題目就是讓你求出有多少種排列滿足小根堆
由於每個點的限制條件構成了一顆二叉樹
所以我們可以設f[i]表示以值i為根的小根堆的數目
那麼顯然ta的子樹內的所有取值都要比他大
所以我們可以統計出它及它的子樹有多少大num[i]
這樣\(f[i] =c(num[i],num[ls])*f[ls]*f[rs]\)就可以轉移了
因為到i時有num[i]個值待選
那麼分配num[ls]個值給左子樹的方案數乘上f[ls]和f[rs]就是f[i]了
#include#include#include#includeconst int m = 1000005 ;
using namespace std ;
int n , mod ;
int f[m] , fac[m] , num[m] ;
inline int fpw(int base , int k)
return temp ;
}inline int c(int n , int m)
int main()
cout << f[1] << endl ;
return 0 ;
}
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 排列計數
求1 n的全排列 p i 的個數,滿足對於 i geq 2 有 p i p 隨手畫個圖就可以發現問題是求大小為 n 的小根堆的個數 由於左右子樹互不影響,直接dp即可,設 dp 表示以 i 為根的小根堆的個數,有 dp i dp dp c size i 1 size 注意本題模數可能小於 n 所以要...
ZJOI2010 排列計數
注意觀察題目 pi pi 2 發現特別像什麼?二叉堆!於是就變成了 n 個堆元素進行排列,滿足堆性質的排列對 p 的取模。堆性質根據題意為大根堆 設 f i 為當前堆首為 i 的堆的排列方案數。為滿足堆性質 p i 顯然只能取剩下若干數的最大值。發現 f i 影響 f 和 f 兩個結點。以 i 為根...