Loading

abc 230 e 题解

abc 230 e

题意

给定正整数 \(N\),请计算 \(\sum \limits _ {i = 1} ^ N [\frac{N}{i}]\)

\(1 \le N \le 10 ^ {12}\)

思路

首先,这个题目有一个很明显的暴力:枚举每一个 \(i\),求和。

但是,很明显,时间复杂度为 \(O(N)\),会超时。

所以,应该怎么优化时间复杂度呢?

根号分治

将题目所求的和分成两个部分。

  1. 如果 \(i \le \sqrt {N}\),则直接暴力求解。

  2. 如果 \(i > \sqrt {N}\),则说明 \(\frac{N}{i} < \sqrt{N}\),可以枚举 \(\frac{N}{i}\),求有多少个对应的 \(i\)

    那么,要怎么计算有多少个对应的 \(i\) 呢?

    我们令 \(k = [\frac{N}{i}]\),则 \(k \le \frac{N}{i} < k + 1\),所以 \(\frac{N}{k + 1} < i \le \frac{N}{k}\)

    既然得到了 \(i\) 的范围,那么 \(i\) 的数量就很容易求了。

    注意:第一步和第二步很有可能会将某些答案重复计算,要注意循环范围。

整除分块

\([\frac{N}{i}] = k\) 时对应的 \(i\) 的范围在 \(l \sim r\) 之间,则 \(r = [\frac{N}{[\frac{N}{i}]}]\)

这里也很简单,在上面,我们说 \(\frac{N}{k + 1} < i \le \frac{N}{k}\),而 \(k\) 就是 \([\frac{N}{i}]\),所以可以得到 \(r\) 的取值。

而因为所有 \(k\) 一定都是连续一段出现的,所以上一个 \(k\) 出现的最后一个 \(i\) 的位置 \(+ 1\) 就是现在的 \(l\)

所以,最终,两种方法的总时间复杂度均为 \(O(\sqrt{N})\)

posted @ 2023-03-09 13:48  chengning0909  阅读(17)  评论(0编辑  收藏  举报