数论分块

数论分块

引入

\(f(n)=\sum\limits^{n}_{i=1} \lfloor \frac{n}{i} \rfloor\),给定一个 \(n\) ,求 \(f(n)\) 的值。

需要整除分块的知识。

在给定一个 \(n\) 的前提下,可以发现 \(\lfloor \frac{n}{i} \rfloor\) 的取值在连续一段区间内相同,故可以分为若干块分别进行计算。这就是整除分块的核心思想。

分块数量

给定一个 \(n\) ,设有集合 \(A = \{x | x = \lfloor \frac{n}{i} \rfloor,1 \leq i \leq n,i \in \Zeta \}\),\(card(A) \leq 2\sqrt{n}\)。

这样整除分块的时间复杂度为 \(\Omicron(\sqrt{n})\)。

分块边界

设 \(l\) 为分块左边界,\(r\) 为分块右边界,\(k\) 为这个块的单值,那么 \(k=\lfloor \frac{n}{l} \rfloor\),\(n=k*i+z, z \in [0, k)\),所以 \(i = \frac{n-z}{k}\),可得 \(i \leq \lfloor\frac{n}{k}\rfloor\),即 \(r=\max(i)=\lfloor\frac{n}{k}\rfloor\)。将 \(k=\lfloor \frac{n}{l} \rfloor\) 带入,\(r = \lfloor \frac{n}{ \lfloor \frac{n}{l} \rfloor } \rfloor\)。

所以分块的值为 \(k*(r-l+1)\)。

int separate(int n) {
  int res = 0;  
  int l = 1, r;       
  while (l <= n) {
    r = n / (n / l);  
    res += 1LL * (r - l + 1) * (n / l);
    l = r + 1;  
  }
  return res;
}
posted @ 2024-06-29 10:11  Foreverlcrun  阅读(93)  评论(0)    收藏  举报
Title