整除分块 学习笔记
板子题
板子题-UVA11526
题目大意:
给定一个 ,求 。其中 为 位无符号整数。
题目解析
显然如果暴力求解肯定是不可行的,显然会 TLE,所以我们需要找一种复杂度更优的算法。
我们可以先令 ,观察一下函数 的图像:
观察可以发现,不难发现:
当 的时候,。
当 的时候,。
当 的时候,。
当 的时候,。
当 的时候,。
我们是否能够预处理出每个使 相同的区间来更快地计算答案呢?
不难发现以下结论:
证明:
当 时, 最多 个数字。
当 时,,最多有 个数字。
因此最多只有 个数字。
整除分块结论
对于一个数字 ,如果 成立,那么满足 最大的 为
根据前面的结论,这种做法的复杂度为 。
代码:
#include<cstdio> #define ll long long using namespace std; ll n,ans; void work(){ scanf("%lld",&n); ans=0; ll l=1,r; while(l<=n){ r=n/(n/l); ans+=(r-l+1)*(n/l); l=r+1; } printf("%lld",ans),putchar('\n'); return; } int main(){ int T; scanf("%d",&T); while(T--) work(); return 0; }
引申
显然在一般的求值题目中的式子不会这么简单,一般都形如
此时预处理出 的前缀和 就可以在 求出这个式子的值了。
代码大致如下:
l=1,sum=0; while(l<=n){ r=n/(n/l); ans+=(g(r)-g(l-1))*(n/l); l=r+1; }
多维数论分块
如果求值的函数中含有 ,
那么我们只需要将前面的结论的 改为 即可。
(当然 的情况比较常见)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-04-25 洛谷 P5431 【模板】乘法逆元2 题解