info: { blogIcon: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogUser: 'OIerBoy', blogAvatar: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogStartDate: '2023-04-22', webpageTitleOnblur: '(o?v?)ノ Hi', webpageTitleOnblurTimeOut: 1000, webpageTitleFocus: '(*′?`*) 欢迎回来!', webpageTitleFocusTimeOut: 1000, webpageIcon: "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/blog_logo.webp", { enable: true, // 是否开启日/夜间模式切换按钮 auto: { // 自动切换相关配置 enable: false, // 开启自动切换 dayHour: 5, // 日间模式开始时间,整数型,24小时制 nightHour: 19 // 夜间模式开始时间,整数型,24小时制 } } },

整除分块

问题引入

\(\displaystyle\sum_{i=1}^N\lfloor\dfrac{N}{i}\rfloor,N\le 10^{12}\)

整除分块

我们这道题暴力枚举显然不行。
考虑向下取整的性质:向下取整得到的数一定是 \(N\) 的因子。
我们不难发现,一个整数 \(N\) 的因子最多有 \(2\sqrt{N}\) 个。
证明:很简单,我们设 \(xy=N(x\le y)\),则 \(x\le\sqrt{N}\)。那么 \(x\) 的个数最多为 \(\sqrt{N}\) 个,而 \(xy\) 一定是成对出现的,所以 \(N\) 的因子最多 \(2\sqrt{N}\)
那么我们考虑如何利用这个 \(2\sqrt{N}\) 来解决。
即,我们记 \(k=\dfrac{N}{i}[i\equiv 0 \pmod N],k'=\lfloor\dfrac{N}{i'}\rfloor\),令 \(k=k'\)
我们考虑此时的 \(i'_{\max}\) 是多少。
先说结论:\(\biggl\lfloor\dfrac{N}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor\)
证明:
已知 \(k=\dfrac{N}{i}[i\equiv 0 \pmod N]\) 可以有 \(i\times k+p=N(0\le p<i)\),对于 \(\lfloor\dfrac{N}{i+d}\rfloor,i'=i+d\)\((i+d)\times k+p'=N(0\le p'<i)\)
\(p'=p-kd\),所以 \(d\le\lfloor\dfrac{p}{k}\rfloor\)

\[\begin{aligned}i'_{\max}= & i+d_{\max}\\= & i+\lfloor\dfrac{p}{k}\rfloor\\= & i+\biggl\lfloor\dfrac{N-i\times k}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor\\= & i+\biggl\lfloor\dfrac{N\mod i}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor\\= & i+\biggl\lfloor\dfrac{N-\lfloor\dfrac{N}{i}\rfloor i}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor\\= & \biggl\lfloor\dfrac{\lfloor\frac{N}{i}\rfloor i}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor+\biggl\lfloor\dfrac{N-\lfloor\frac{N}{i}\rfloor i}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor\\= & \biggl\lfloor\dfrac{\lfloor\frac{N}{i}\rfloor i+N-\lfloor\frac{N}{i}\rfloor i}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor\\= & \biggl\lfloor\dfrac{N}{\lfloor\frac{N}{i}\rfloor}\biggl\rfloor \end{aligned} \]

好了,现在我们只需要用一个双指针 \(l,r\) 来维护一下每一个因子就行了,时间复杂度 \(O(\sqrt{N})\)

posted @ 2023-10-09 17:15  OIerBoy  阅读(13)  评论(0编辑  收藏  举报