参考的资料尽可能都列出来吧:
- 整除分块(数论分块) b y 0 x f f f e \sf by~0\color{red}xfffe by 0xfffe
- 整除分块 b y p e n g − y m \sf by~p\color{red}eng\!\!-\!\!ym by peng−ym
- 数论分块 b y h e n r y _ y \sf by~h\color{red}enry\_y by henry_y
无前置芝士,但至少你要能看懂本文中出现的所有记号
Lv.1
想不出标题只好这样写标题的屑作者
数论分块是用于处理形如 ∑ i = 1 n ⌊ n i ⌋ \sum\limits_{i=1}^n \left\lfloor\dfrac ni\right\rfloor i=1∑n⌊in⌋ 的式子的方法。
为了简洁和减轻 LaTeX \LaTeX LATEX 渲染的负担,下文中会用形如 i / j i/j i/j 的式子表示 ⌊ j i ⌋ \lfloor\frac ji\rfloor ⌊ij⌋ 。
显然这个式子可以 Θ ( n ) \Theta(n) Θ(n) 暴力求出,但是实际上有优秀得多的 Θ ( n ) \Theta(\sqrt n) Θ(n) 解法。
首先我们证明: n / i n/i n/i 的取值最多只有 2 n 2\sqrt n 2n 种。
当 1 ≤ i ≤ n 1 \le i \le \sqrt n 1≤i≤n 时, i i i 的取值有 n \sqrt n n 种,则上式对应的取值也最多只有 n \sqrt n n 种。
当 n < i ≤ n \sqrt n <i \le n n<i≤n 时, 1 ≤ n / i ≤ n 1 \le n/i \le \sqrt n 1≤n/i≤n ,则式子的取值也最多只有 n \sqrt n n 种。
综上,命题成立。
那么,如果我们能枚举 n / i n/i n/i 的值求得答案,算法的时间复杂度就可以达到 Θ ( n ) \Theta(\sqrt n) Θ(n) 。
现在的问题就是,对于 n / i n/i n/i 的一个取值(设为 k k k),满足 n / i = k n/i=k n/i=k 的 i i i 有多少个。
考虑用数学方法确定 i i i 的范围。
实际上, i i i 的上限为 n / ( n / i ) n/(n/i) n/(n/i) 。可以感性理解,但下面还是给出证明:
设 i i i 的某个取值满足 n / i = k n/i=k n/i=k