数论分块

问题描述

给定一个正整数 \(n\),求当 \(k\)\(1\)\(n\) 时,\(\left\lfloor \frac{n}{k} \right\rfloor\) 的不同取值个数。

分析

理解 \(\left\lfloor \frac{n}{k} \right\rfloor\) 的含义

  • \(\left\lfloor \frac{n}{k} \right\rfloor\) 表示 \(n\) 除以 \(k\) 的整数部分。
  • 随着 \(k\) 的增加,\(\left\lfloor \frac{n}{k} \right\rfloor\) 逐渐减小或保持不变。

分块

\(k\) 的范围分成若干块,使得在每个块内 \(\left\lfloor \frac{n}{k} \right\rfloor\) 保持不变

也就说对于一块Q,左边界是l,右边界是r ,$$\forall i \in [l,r],\left\lfloor \frac{n}{l} \right\rfloor=\left\lfloor \frac{n}{i} \right\rfloor=\left\lfloor \frac{n}{r} \right\rfloor$$

  • 对于每个 \(m\),定义 \(\left\lfloor \frac{n}{k} \right\rfloor = m\) 的范围为:

    \[\frac{n}{m + 1} < k \leq \frac{n}{m}. \]

  • 因此,满足上述不等式的整数 \(k\) 的数量为:

    \[\left\lfloor \frac{n}{m} \right\rfloor - \left\lfloor \frac{n}{m + 1} \right\rfloor. \]

计算不同 \(m\) 值的数量

  • 不同的 \(m\) 值的数量等于所有 \(m\) 中,块大小至少为 \(1\)\(m\) 的数量。
  • 即,需要满足:

    \[\left\lfloor \frac{n}{m} \right\rfloor > \left\lfloor \frac{n}{m + 1} \right\rfloor. \]

分布计算

  1. 前半部分$ k \leq \sqrt{n} $:
    每个 $ k $ 对应唯一值 $ \lfloor n/k \rfloor \geq \lfloor \sqrt{n} \rfloor $,因此不同值数量为 $ \lfloor \sqrt{n} \rfloor $

  2. 后半部分\(k >\sqrt{n}\):
    $ \lfloor n/k \rfloor $ 的取值范围为 $ 1 \leq v \leq \lfloor \sqrt{n} \rfloor $,但每个 $ v $ 对应的 $ k $ 区间为 $ \left( \frac{n}{v+1}, \frac{n}{v} \right] $。
    因此,有效 $ v $ 的个数为 $ \lfloor \frac{n}{\lfloor \sqrt{n} \rfloor + 1} \rfloor $

答案

不同的 \(m\) 值的数量为:

\[\left\lfloor \sqrt{n} \right\rfloor + \left\lfloor \frac{n}{\left\lfloor \sqrt{n} \right\rfloor + 1} \right\rfloor. \]

For example

$ n = 10 $ 时 \(\left\lfloor \frac{n}{k} \right\rfloor\) 不同取值个数


  1. 计算分界点:

    • \(\lfloor \sqrt{10} \rfloor = 3\),将区间分为 \(k \leq 3\)\(k > 3\) 两部分。
  2. 前半部分(\(k \leq 3\)):

    • \(k=1\): \(\lfloor 10/1 \rfloor = 10\)
    • \(k=2\): \(\lfloor 10/2 \rfloor = 5\)
    • \(k=3\): \(\lfloor 10/3 \rfloor = 3\)
    • 不同值数量:3 个(10, 5, 3)。
  3. 后半部分(\(k > 3\)):

    • 计算 \(\lfloor 10/(3+1) \rfloor = \lfloor 10/4 \rfloor = 2\),表示可能的值为 \(2\)\(1\)
      • \(k=4\)\(k=5\): \(\lfloor 10/4 \rfloor = 2\), \(\lfloor 10/5 \rfloor = 2\)
      • \(k=6\)\(k=10\): \(\lfloor 10/k \rfloor = 1\)
    • 不同值数量:2 个(2, 1)。

  1. 总个数:
    • \(3 + 2 = 5\) 个不同值:\(\{10, 5, 3, 2, 1\}\)

列出所有 \(k=1\)\(k=10\) 的结果:

\[\lfloor 10/k \rfloor = \{10, 5, 3, 2, 2, 1, 1, 1, 1, 1\} \]

去重后得到 \(\{10, 5, 3, 2, 1\}\),共 5 个不同值,与公式结果一致。


其他例子

  • \(n=6\)\(\lfloor \sqrt{6} \rfloor = 2\),后半部分 \(\lfloor 6/(2+1) \rfloor = 2\),总个数 \(2+2=4\)
    实际结果:\(\{6, 3, 2, 1\}\)
  • \(n=9\)\(\lfloor \sqrt{9} \rfloor = 3\),后半部分 \(\lfloor 9/(3+1) \rfloor = 2\),总个数 \(3+2=5\)
    实际结果:\(\{9, 4, 3, 2, 1\}\)

例题

\(N\% i,(i \in [1,n])\)前k大余数和
见此题解,G题

本文作者:归游

本文链接:https://www.cnblogs.com/guiyou/p/18696031

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   归游  阅读(14)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起