【模板】数论分块
给定正整数 n n n ,求
∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor
i = 1 ∑ n ⌊ i n ⌋
其中 ⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor ⌊ i n ⌋ 表示求不超过 n i \frac{n}{i} i n 的最大整数,比如:⌊ 5 2 ⌋ = 2 \lfloor\frac{5}{2}\rfloor=2 ⌊ 2 5 ⌋ = 2 ,⌊ 10 3 ⌋ = 3 \lfloor\frac{10}{3}\rfloor=3 ⌊ 3 10 ⌋ = 3
可以理解为就是 C++ 中的除法
输入格式
第 1 行包含 1 个正整数 T T T ;
接下来 T T T 行,每行包含一个正整数 n ( 1 ≤ n ≤ 10 12 ) n(1 \le n \le 10^{12}) n ( 1 ≤ n ≤ 1 0 12 )
输出格式
对于每组数据输出 1 行表示答案
2
5
10
10
27
提示
【样例 #1 解释】
$\lfloor\frac{5}{1}\rfloor+\lfloor\frac{5}{2}\rfloor+\lfloor\frac{5}{3}\rfloor+\lfloor\frac{5}{4}\rfloor+\lfloor\frac{5}{5}\rfloor=5+2+1+1+1=10$
数论分块
oiwiki: 数论分块
学习总结-莫比乌斯反演
考虑 n = 10 n = 10 n = 10 时的结果,10 + 5 + 3 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 27 10+5+3+2+2+1+1+1+1+1=27 10 + 5 + 3 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 27
可以发现 ⌊ 10 6 ⌋ \lfloor\frac{10}{6}\rfloor ⌊ 6 10 ⌋ 到 ⌊ 10 10 ⌋ \lfloor\frac{10}{10}\rfloor ⌊ 10 10 ⌋ 的结果都是 1 1 1
设 k = ⌊ n l ⌋ k = \lfloor\frac{n}{l}\rfloor k = ⌊ l n ⌋ ,r r r 是使得 ⌊ n x ⌋ = k \lfloor\frac{n}{x}\rfloor=k ⌊ x n ⌋ = k 的最大的 x x x (比如 n = 10 , l = 6 , r = 10 n=10, l=6, r = 10 n = 10 , l = 6 , r = 10 )
由 ⌊ n x ⌋ = k \lfloor\frac{n}{x}\rfloor=k ⌊ x n ⌋ = k 得到 n = x k + r n=xk+r n = x k + r ,当 r = 0 r=0 r = 0 时,x x x 最大是 ⌊ n k ⌋ \lfloor\frac{n}{k}\rfloor ⌊ k n ⌋
所以 $r=\lfloor\frac{n}{k}\rfloor=\lfloor\frac{n}{\lfloor\frac{n}{l}\rfloor}\rfloor$
所以我们可以这样计算
i64 T, n;
cin >> T;
while (T--) {
cin >> n;
i64 ans = 0;
for (i64 l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans += n / l * (r - l + 1);
}
cout << ans << '\n';
}
可以证明 ⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor ⌊ i n ⌋ 最多有不超过 ⌊ 2 n ⌋ \lfloor 2\sqrt n \rfloor ⌊ 2 n ⌋ 个值
当 i ≤ ⌊ n ⌋ i \le \lfloor \sqrt n \rfloor i ≤ ⌊ n ⌋ 时,⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor ⌊ i n ⌋ 最多有 ⌊ n ⌋ \lfloor \sqrt n \rfloor ⌊ n ⌋ 个不同的值
当 i > ⌊ n ⌋ i > \lfloor \sqrt n \rfloor i > ⌊ n ⌋ 时,⌊ n i ⌋ ≤ n \lfloor\frac{n}{i}\rfloor \le \sqrt n ⌊ i n ⌋ ≤ n ,也只有 ⌊ n ⌋ \lfloor \sqrt n \rfloor ⌊ n ⌋ 个不同的值
所以计算 ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor ∑ i = 1 n ⌊ i n ⌋ 的时间复杂度是 O ( n ) O(\sqrt n) O ( n )
请思考后再点击查看提示
数据规模与限制
1 ≤ T ≤ 10 1 \leq T \leq 10 1 ≤ T ≤ 10
1 ≤ n ≤ 10 12 1 \leq n \leq 10^{12} 1 ≤ n ≤ 1 0 12
来源