1. 程式人生 > 其它 >[Exercises on 2022.5.3] Dynamic Programming

[Exercises on 2022.5.3] Dynamic Programming

例 1. \(\text{CF582D Number of Binominal Coefficients}\)

不妨將 \(n,k\) 換一個形式:求滿足 \(0 \le a+b \le A\)\(p^{\alpha}\mid \binom{a+b}{a}\) 的數對 \((a,b)\) 的個數。事實上我們有

\(\text{Kummer Theorem}\)\(\binom{a+b}{a}\) 所包含的 \(p\) 的冪次數為 \(a+b\)\(p\) 進位制下的進位次數。

首先由勒讓德定理,可以知道\(\binom{a+b}{a}\) 所包含的 \(p\) 的冪次數為

\[\sum_{i=1}\left\lfloor \frac{a+b}{p^i} \right\rfloor-\sum_{i=1}\left\lfloor \frac{a}{p^i} \right\rfloor-\sum_{i=1}\left\lfloor \frac{b}{p^i} \right\rfloor \]

事實上,\(\left\lfloor \frac{n}{p^i} \right\rfloor\)

等於 \(n\)\(p\) 進位制下去掉後 \(i\) 位所得到的數字,而第 \(i\) 位發生進位的充要條件顯然是 \(\left\lfloor \frac{a+b}{p^i} \right\rfloor=\left\lfloor \frac{a}{p^i} \right\rfloor+\left\lfloor \frac{b}{p^i} \right\rfloor+1\),所以結論得證。

具體 \(\mathtt{dp}\) 過程戳這:\(\rm Link.\)


例 2. \(\text{[agc028D] Chords}\)

維護一個擁有多個連通塊的狀態是不易的,所以我們考慮列舉連通塊,再統計此連通塊出現的次數。

這好像還是不好做,圓上的問題考慮破環為鏈,不妨考慮區間 \(\mathtt{dp}\),用 \([l,r]\) 表示最左點為 \(l\),最右點為 \(r\) 的連通塊,我們發現這可以完美地將連通塊內的邊的端點限制在 \([l,r]\) 之中!這是因為即使點 \(x\) 不屬於 \(l,r\) 所在的連通塊,這條邊也會使得 \(l,r,x\) 連通,從而不滿足 "最左點為 \(l\),最右點為 \(r\)" 的條件。這也是區間 \(\mathtt{dp}\) 的基礎。

記輔助陣列 \(c(l,r)\) 為區間 \([l,r]\) 中未被連邊的點數,\(f(x)\)\(x\) 個點任意連邊的方案數,那麼轉移有

\[dp(l,r)=f(c(l,r))-\sum_{k=l}^{r-1}dp(l,k)\cdot f(c(k+1,r)) \]

就是一個容斥。需要注意的是,當 \(c(l,r)\) 為奇數時,內部顯然無法兩兩配對,此時的 \(f\) 值應為零。