整除分块入门
整除分块是数论中的一个技巧,个人认为最好的理解方法是根据板题/例题解释。下面直接放了三道例题。
例1
题意
求
这道题的
举个例子,
把下面的所有的
思路
假设当前贡献值的左边界为
那么能得到:
所以我们考虑能不能通过确定了
所以我们通过向下取整的性质得出:
然后每次当前的
时间复杂度
因为
分情况讨论,
第一种
而集合里每个元素对时间复杂度的贡献是是
所以接下来的东西就显而易见了。
#include <bits/stdc++.h>
#define ll long long
#define L(i, a, b) for(int i = a; i <= b; i++)
#define R(i, a, b) for(int i = a; i >= b; i--)
using namespace std;
int T, n; ll ans;
int main(){
scanf("%d", &T);
while(T--){
scanf("%d", &n), ans = 0;
for(int l = 1, r; l <= n; l = r + 1){
r = n / (n / l);
ans += (r - l + 1) * (n / l);
}
printf("%lld\n", ans);
}
return 0;
}
例2
思路
每个正整数
那么对于
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline ll h(const ll n){
ll ans = 0;
for(register ll l = 1, r; l <= n; l = r + 1){
r = n / (n / l);
ans += (l + r) * (r - l + 1) / 2 * (n / l);
}
return ans;
}
int main(){
ll l, r;
scanf("%lld%lld", &l, &r);
printf("%lld\n", h(r) - h(l - 1));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下