[洛谷 P3935] Calculating(整数分块) | 错题本

文章目录

题目

[洛谷 P3935] Calculating

分析

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(l1)

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=1nj=1i[i mod j=0]j=1njn

整数分块:
对于 i , n ∈ N + i, n \in \N^+ i,nN+,试找到一个最大的 j ∈ N + j \in \N^+ jN+,使得 ⌊ 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=inn

证明:
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=jnkjn<k+1k+11<njk1kn<jkn
于是 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=inn

可以证明,对于任意 n ∈ N + n \in \N^+ nN+ ∣ { ⌊ 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 {iniN+,in}2n

证明:
显然 ∣ { ⌊ 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 {iniN+,in }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 inn innn {inniN+,in }n {iniN+,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 {iniN+,in}={iniN+,in }+{iniN+,i>n }2n

因此数论分块的时间复杂度 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值