不是很懂為什麼洛谷上這題標籤有數字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(i−
1,l)
f[i]=f[l]*f[r]*c(i-1,l)
f[i]=f
[l]∗
f[r]
∗c(i
−1,l
)組合數用luc
as
lucas
luca
s定理就好解決了。
#include#define ll long long
#define li (i<<1)
#define ri (li|1)
using namespace std;
const int n=5e6+5;
int mo,n;
ll f[n],fac[n],s[n];
void init(int n)
inline ll qpow(ll x,ll p,int mo)
return res;
}inline ll c(ll n,ll m,int mo)
return c(n/mo,m/mo,mo)*c(n%mo,m%mo,mo)%mo;
}int main()
return !printf("%lld",f[1]);
}
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 為根...
ZJOI2010 排列計數
稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出檔案中僅包含乙個整數,表示計算1,2,的排列中,magic排列的個數模 ...