题目
分析
f
(
i
)
f(i)
f(i) 是约数个数函数。
令
g
(
n
)
=
∑
i
=
1
n
f
(
i
)
g(n) = \sum_{i = 1}^{n} f(i)
g(n)=∑i=1nf(i),则
∑
i
=
l
r
f
(
i
)
=
g
(
r
)
−
g
(
l
−
1
)
\sum_{i = l}^{r}f(i) = g(r) - g(l - 1)
∑i=lrf(i)=g(r)−g(l−1)。
g ( n ) = ∑ i = 1 n ∑ j = 1 i [ i mod j = 0 ] = ∑ j = 1 n ⌊ n j ⌋ \begin{aligned} g(n) =& \sum_{i = 1}^n \sum_{j = 1}^i [i \text{ mod } j = 0] \\ =& \sum_{j = 1}^n \left\lfloor\frac{n}{j}\right\rfloor\end{aligned} g(n)==i=1∑nj=1∑i[i mod j=0]j=1∑n⌊jn⌋
整数分块:
对于
i
,
n
∈
N
+
i, n \in \N^+
i,n∈N+,试找到一个最大的
j
∈
N
+
j \in \N^+
j∈N+,使得
⌊
n
i
⌋
=
⌊
n
j
⌋
\left\lfloor \frac{n}{i} \right\rfloor = \left\lfloor \frac{n}{j} \right\rfloor
⌊in⌋=⌊jn⌋。
可以证明,
j
m
a
x
=
⌊
n
⌊
n
i
⌋
⌋
j_{max} = \left\lfloor \frac{n}{\left\lfloor \frac{n}{i} \right\rfloor} \right\rfloor
jmax=⌊⌊in⌋n⌋。
证明:
设 k = ⌊ n i ⌋ = ⌊ n j ⌋ k = \left\lfloor \frac{n}{i} \right\rfloor = \left\lfloor \frac{n}{j} \right\rfloor k=⌊in⌋=⌊jn⌋:
k = ⌊ n j ⌋ ⟺ k ≤ n j < k + 1 ⟺ 1 k + 1 < j n ≤ 1 k ⟺ n k < j ≤ n k k = \left\lfloor \frac{n}{j} \right\rfloor \iff k \leq \frac{n}{j} < k + 1 \iff \frac{1}{k + 1} < \frac{j}{n} \leq \frac{1}{k} \iff \frac{n}{k} < j \leq \frac{n}{k} k=⌊jn⌋⟺k≤jn<k+1⟺k+11<nj≤k1⟺kn<j≤kn。
于是 j m a x = ⌊ n k ⌋ = ⌊ n ⌊ n i ⌋ ⌋ j_{max} = \left\lfloor \frac{n}{k} \right\rfloor = \left\lfloor \frac{n}{\left\lfloor \frac{n}{i} \right\rfloor} \right\rfloor jmax=⌊kn⌋=⌊⌊in⌋n⌋。
可以证明,对于任意 n ∈ N + n \in \N^+ n∈N+, ∣ { ⌊ n i ⌋ ∣ i ∈ N + , i ≤ n } ∣ ≤ 2 ⌊ n ⌋ \left|\left\{\left\lfloor \frac{n}{i} \right\rfloor \mid i \in \N^+, i \leq n\right\}\right| \leq 2 \left\lfloor \sqrt{n} \right\rfloor ∣∣{⌊in⌋∣i∈N+,i≤n}∣∣≤2⌊n⌋。
证明:
显然 ∣ { ⌊ n i ⌋ ∣ i ∈ N + , i ≤ n } ∣ ≤ ⌊ n ⌋ \left|\left\{\left\lfloor \frac{n}{i} \right\rfloor \mid i \in \N^+, i \leq \sqrt{n}\right\}\right| \leq \left\lfloor \sqrt{n} \right\rfloor ∣∣{⌊in⌋∣i∈N+,i≤n}∣∣≤⌊n⌋。
考虑 ⌊ n i ⌋ > ⌊ n ⌋ \left\lfloor \frac{n}{i} \right\rfloor > \left\lfloor \sqrt{n} \right\rfloor ⌊in⌋>⌊n⌋ 时:
⌊ n i ⌋ ≤ ⌊ n ⌋ ⟹ ⌊ n ⌊ n i ⌋ ⌋ ≥ n ⟹ ∣ { ⌊ n ⌊ n i ⌋ ⌋ ∣ i ∈ N + , i ≤ n } ∣ ≤ ⌊ n ⌋ ⟺ ∣ { ⌊ n i ⌋ ∣ i ∈ N + , i > n } ∣ ≤ ⌊ n ⌋ \left\lfloor \frac{n}{i} \right\rfloor \leq \left\lfloor \sqrt{n} \right\rfloor \implies \left\lfloor \frac{n}{\left\lfloor \frac{n}{i} \right\rfloor} \right\rfloor \geq \sqrt{n} \implies \left|\left\{\left\lfloor \frac{n}{\left\lfloor \frac{n}{i} \right\rfloor} \right\rfloor \mid i \in \N^+, i \leq \sqrt{n}\right\}\right| \leq \left\lfloor \sqrt{n} \right\rfloor \iff \left|\left\{\left\lfloor \frac{n}{i} \right\rfloor \mid i \in \N^+, i > \sqrt{n}\right\}\right| \leq \left\lfloor \sqrt{n} \right\rfloor ⌊in⌋≤⌊n⌋⟹⌊⌊in⌋n⌋≥n⟹∣∣∣∣{⌊⌊in⌋n⌋∣i∈N+,i≤n}∣∣∣∣≤⌊n⌋⟺∣∣{⌊in⌋∣i∈N+,i>n}∣∣≤⌊n⌋。
于是 ∣ { ⌊ n i ⌋ ∣ i ∈ N + , i ≤ n } ∣ = ∣ { ⌊ n i ⌋ ∣ i ∈ N + , i ≤ n } ∣ + ∣ { ⌊ n i ⌋ ∣ i ∈ N + , i > n } ∣ ≤ 2 ⌊ n ⌋ \left|\left\{\left\lfloor \frac{n}{i} \right\rfloor \mid i \in \N^+, i \leq n\right\}\right| = \left|\left\{\left\lfloor \frac{n}{i} \right\rfloor \mid i \in \N^+, i \leq \sqrt{n}\right\}\right| + \left|\left\{\left\lfloor \frac{n}{i} \right\rfloor \mid i \in \N^+, i > \sqrt{n}\right\}\right| \leq 2 \left\lfloor \sqrt{n} \right\rfloor ∣∣{⌊in⌋∣i∈N+,i≤n}∣∣=∣∣{⌊in⌋∣i∈N+,i≤n}∣∣+∣∣{⌊in⌋∣i∈N+,i>n}∣∣≤2⌊n⌋。
因此数论分块的时间复杂度 O ( n ) O(\sqrt{n}) O(n)。
代码
#include <bits/stdc++.h>
typedef long long LL;
const int MOD = 998244353;
LL Cal(LL N) {
LL ret = 0;
for (LL lft = 1, rgt = 1; lft <= N; lft = rgt + 1) {
rgt = std::min(N / (N / lft), N);
ret = (ret + (rgt - lft + 1) * (N / lft) % MOD) % MOD;
}
return ret;
}
int main() {
LL L, R; scanf("%lld%lld", &L, &R);
printf("%lld", ((Cal(R) - Cal(L - 1)) % MOD + MOD) % MOD);
return 0;
}