例 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\) 的幂次数为
事实上,\(\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\) 个点任意连边的方案数,那么转移有
就是一个容斥。需要注意的是,当 \(c(l,r)\) 为奇数时,内部显然无法两两配对,此时的 \(f\) 值应为零。
例 3.
\(\text{[agc036D] Negative Cycle}\)
一些闲话:最近效率好低啊……沮丧。这辈子要是能想出来这个转化我就真的牛逼了。
题目中一句比较重要的话是,\(\rm Snuke\) 只会删除他加入的边。
考虑条件的转化,图中不存在负环等价于存在一组合法的差分约束的解,这是因为如果不存在合法差分约束的解就会一直进行最短路的更新,也就是存在负环。
记点 \(i\) 的变量为 \(x_i\),由于初始边不能删去,那么一定有 \(x_i\ge x_{i+1}\)。令 \(q_i=x_i-x_{i+1}\),那么就有 \(q_i\ge 0\).
假设保留了一条边权为 \(-1\) 的 \(i \to j\) 的边,也就是说 \(i < j\) 的话,就会有 \(x_i - 1 \ge x_j\),即 \(x_i - x_j \ge 1\),也就是说 \(q_i + q_{i + 1} + \cdots + q_{j - 1} \ge 1\)。那么也就是 \([i,j)\) 区间和为零时需要删除此边。
假设保留了一条边权为 \(1\) 的 \(i \to j\) 的边,也就是说 \(i > j\) 的话,就会有 \(x_i + 1 \ge x_j\),即 \(x_j - x_i \le 1\),也就是说 \(q_j + q_{j + 1} + \cdots + q_{i - 1} \le 1\)。那么也就是 \([j,i)\) 区间和 \(>1\) 时需要删除此边。
另外一个重要的 \(\rm observation\) 是 \(q\) 的取值范围为 \([0,1]\)。考虑有 \(x_i\ge x_{i+1}\),且最小边权为 \(-1\),显然,\(i+1\) 从任意一个 \(<i\) 的点转移而来也只可能比 \(x_i\) 小 \(1\)(即上述不等式取等)。
然后就可以对 \(q\) 数组 \(\mathtt{dp}\) 了,设 \(dp(i,j)\) 为确定了前 \(i\) 位的 \(q\) 值,且第 \(i\) 位为 \(1\),第 \(j\) 位是离 \(i\) 最近的 \(q\) 值为 \(1\) 的下标。
我们模拟从 \(dp(i,j)\) 转移到 \(dp(k,i)\) 的过程:
- 对于边权为 \(-1\) 的边。新增了 \((i,k)\) 这一全零区间,显然端点均在这个区间内的边需要被删除,这个可以用二维前缀和处理;
- 对于边权为 \(1\) 的边。计算包含点 \(i,k\) 但不包含点 \(j\) 的边,否则会算重。
复杂度 \(\mathcal O(n^3)\).
例 4.
\(\text{CF1239E Turtle}\)
令数列 \(\{x\}\) 为 \(\{a_1\}\)、\(\{y\}\) 为 \(\{a_2\}\),那么一种合法的行走方式一定是 \(x_1,x_2,\dots,x_i,y_i,\dots,y_n\),并记 \(i\) 为拐点。
将 \(\{x\}\) 从小到大、\(\{y\}\) 从大到小排序,显然答案只会不劣 —— 不妨设 \(x_i>x_{i+1}\),如果全选取或完全没选取 \(x_i,x_{i+1}\),那么它们交换没有影响;否则,如果选取靠前的一个,显然 \(x_{i+1}\) 排在前面更优。
考虑两种方案的增量,假设将拐点从 \(i\) 挪到 \(i+1\),增量就是 \(x_{i+1}-y_i\),显然在拐点向右移的过程中,增量是不减的!考虑到 \(\delta\) 的正负,一共只能有两种方案可能取到最优解:拐点为 \(1\) 或 \(n\).
那么实际上给定 \(x,y\) 分配后的答案就是
将 \(\{a\}\) 中最小的两个数选作 \(x_1,y_n\),那么问题转化为将 \(2n-2\) 个数分成两个大小相等的集合 \(S,T\),最小化 \(\max\{\text{val}(A),\text{val}(B)\}\).
实现的时候写了个 \(\text{meet-in-middle}\),慢得像坨 *。