[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\)
具體 \(\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\) 個點任意連邊的方案數,那麼轉移有
就是一個容斥。需要注意的是,當 \(c(l,r)\) 為奇數時,內部顯然無法兩兩配對,此時的 \(f\) 值應為零。