当前位置: 首页 > news >正文

整除分块

数论分块用于求解形如 \(\sum_{i=1}^n\lfloor\frac ni\rfloor\) 的含有向下取整的求和式子,是可以将原本 \(\mathcal O(n)\) 复杂度优化至 \(\mathcal{O}(\sqrt n)\) 的超强实用算法,常与莫比乌斯反演配套使用,同时也是学习莫反的前置芝士
鉴于数论分块非常优秀的时间复杂度,当你看到出题人将数据范围给到 \(n\leq 10^{12}\) 这种连 \(\mathcal{O}(n)\) 都过不了的逆天大小时,请务必考虑数论分块!
这篇只会讨论一般的整除分块,至于各种拓展就先放着以后再说好了


数论分块的思想主要在于将 \(\lfloor\frac ni\rfloor\) 的值相同的项同时计算,一段区间内的数只需要算一次即可,用一个图形象展示一下数论分块:

函数

这是一段反比例函数 \(f(x)=\frac4x\) 的图像,如果将这个函数改变一下变成 \(f(x)=\lfloor\frac4x\rfloor\),上面的函数就会被分成几块,如下图:

函数分块

黑线把蓝线函数划分成不同的线段,每一块都有对应的一个确定的数值,分块大抵就是这样分的图很烂凑合着看看
如此,只要能确定每一个块的区间 \([l,r]\) 就可以快捷计算了。
先说结论:对于一个分块 \(\lfloor\frac ni\rfloor\)\(\lfloor\frac ni\rfloor\) 的值相等的区间的两端为 \([i,\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor]\)
左端点为\(i\)应该很好理解,重点证明右端点。
没什么必要的引理

\[\lfloor x\rfloor\leq x \]

无需证明。
证明过程

要证明\(\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor\)为区间右端点,要证明两个式子:
首先证明\(\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor\)\(i\)在同一个块中,即:$$ \lfloor\frac{n}{\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor}\rfloor=\lfloor\frac ni\rfloor $$

由于:$$\lfloor\frac{n}{\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor}\rfloor \geq \lfloor\frac{n}{\frac{n}{\lfloor\frac ni\rfloor}}\rfloor = \lfloor{\lfloor\frac ni\rfloor}\rfloor = \lfloor\frac ni\rfloor$$
且:$$\lfloor\frac{n}{\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor}\rfloor \leq \lfloor\frac{n}{\lfloor\frac{n}{\frac ni}\rfloor}\rfloor = \lfloor{\frac n{\lfloor i\rfloor}}\rfloor = \lfloor\frac ni\rfloor$$
则有:$$\lfloor\frac{n}{\lfloor\frac{n}{\lfloor\frac ni\rfloor}\rfloor}\rfloor=\lfloor\frac ni\rfloor$$
得证
其次证明 \(\lfloor\frac n{\lfloor\frac ni\rfloor}\rfloor\) 是这个块的最大取值,即:$$\lfloor\frac n{\lfloor\frac ni\rfloor}\rfloor \geq i$$$$\lfloor\frac n{\lfloor\frac ni\rfloor}\rfloor \geq \lfloor\frac n{\frac ni}\rfloor = \lfloor i\rfloor=i$$
得证

于是要求 \(\sum_{i=1}^n\lfloor\frac ni\rfloor\) 就可以每次以 \([l,r]=[l,\lfloor\frac n{\lfloor\frac nl\rfloor}\rfloor]\) 为一个块计算如下:

\[ans=ans+(r-l+1)*\lfloor\frac nl\rfloor \]

注意:如果偶遇形如 \(\sum_{i=1}^nf(i)g(\lfloor\frac ni\rfloor)\) 这种混了其他东西的求和,则需要预处理出 \(f(i)\) 的前缀和,才能按照 \(\mathcal{O}(\sqrt n)\) 计算求和,设 \(s(i)=\sum_{j=1}^if(j)\),则计算过程如下:

\[ans=ans+(s(r)-s(l-1))*g(\lfloor\frac ni\rfloor) \]

注:按照OI WIKI的说法,若能在 \(\mathcal{O}(1)\) 内求出 \(f(r)-f(l)\) 的值,也可以按照 \(\mathcal O(\sqrt n)\) 的时间计算数论分块但是我还没搞懂这是啥意思。
总之核心代码很短,如下:

ans = 0;
for (int l = 1,r = 0;l <= n;l = r + 1)
{r = n / (n / l);ans += (r - l + 1)*(n / l);
}

模板题UVA11526 H(n)直接按上面模板就行了。

http://www.hskmm.com/?act=detail&tid=39847

相关文章:

  • 2025 年造粒机,混合造粒机厂家最新推荐,聚焦资质、案例、售后的优质机构深度解读
  • Java dubbo spring springboot中的spi机制
  • 此乃同余最短路
  • 2025年深圳离婚房产律师权威推荐榜单:婚姻/子女抚养权/股权分割专业团队精选
  • 题解:uoj748 机器人表演
  • 2025 年混合机,强力混合机厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025年深圳婚姻律师权威推荐榜单:离婚房产/子女抚养权/股权分割专业团队精选
  • 微软+清北联合突破:Reinforcement Pre-Training正在改写大模型训练规则
  • 为什么堆只设置了8G,java进程却占用了12G内存?
  • Authlib JOSE组件存在拒绝服务漏洞,攻击者可利用超大令牌段耗尽系统资源
  • Linux 自动输入 Enter 键
  • Voyage系列3: 技巧与提示
  • 合规与创新并重:现代企业DevOps平台的安全战略与实践路径
  • 完全开源!一款基于 SpringBoot + Vue 构建的社区平台!
  • 【一步步开发AI运动APP】十二、如何进行运动开始前的站位预检,提升用户体验
  • Oracle Data Pump 网络模式直接迁移详解(使用数据库链接(Database Link))
  • 2025年10月洗地机产品推荐:五款高口碑机型横向对比榜
  • 2025年10月防脱生发产品推荐:十款口碑榜对比与临床数据全解析
  • 2025年10月美容仪品牌推荐:无创无痛纳晶领衔性价比排行榜
  • 2025 年娱乐麦克风,一拖二无线麦克风,舞台演出麦克风厂家最新推荐,技术实力与市场口碑深度解析
  • 2025年10月工装装修公司推荐榜:全国服务实力对比
  • 使用Voyage持久化对象
  • 2025年10月品牌认证机构推荐:权威榜单对比五强优劣
  • 2025 年安全防坠器厂家最新推荐排行榜权威发布,结合中国安全防护用品行业协会测评数据揭晓行业实力企业成都安全防坠器/安全防坠器测试厂家推荐
  • 矢量图
  • 泛型通配符 T、E、K、V、?
  • 2025 年最新推荐 PPT 生成软件排行榜:权威协会测评 + AI 备案技术加持,3500 万用户信赖之选全面解析
  • 2025 年减速器源头厂家最新推荐榜:RV / 精密 / 通用减速器测试品牌技术实力权威测评
  • 20232413 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 上周热点回顾(10.20