关于整除分块

今天看了这道题:AT_abc132_f [ABC132F] Small Products

我可以得出一个很朴素的方程:\(f_{i, j} = \displaystyle \sum_{k=1}^{\lfloor\frac{n}{j}\rfloor} f_{i-1,k}\)

或者说:\(f_{i, j} \rightarrow \forall k \in [1, n / j] f_{i+1,k}\)

然后因为 j 太大就做不了了。

甚至想过容斥,但是应该知道的是,大于等于 n 和小于 n 应该是差不多难做的。

我们考虑到,\(\lfloor\frac{n}{j}\rfloor\) 是没有多少个的,或者说,在 \(j\) 变化不大时,他能从哪些地方转移来都是一样的。

我们可以将他们一块统计,那这些是那些点呢?

就是将 n 被其整除相同的分成一组,比如 \(n=2\) 就有这样一组 \([34, 50]\)

分出来了就把他当成一个点,然后 DP 就好了。

算是个套路。


for (int l = 1, r;l <= n;l = r + 1) {
	r = min(n, n / (n / l));
	a[++cnt] = r, b[r] = cnt; // a 是某块右端点,b 是右端点到快的映射
	len[cnt] = r - l + 1;
}
posted @ 2025-10-02 19:34  yanbinmu  阅读(4)  评论(0)    收藏  举报