整除分块(未完成)
2026-04-06 13:01:07
发布于:北京
算法讲解
首先我们先以问题:
给出一个 ,求 。
引入。
我们以 为例。

上图为 的函数图像。
我们对此函数进行修改,添加题目中的向下取整:

上图为 的函数图像。
图像被分为了 个部分,但有效的、会被取到的取值只有 个。

那么我们可以把这些包含整数的块取出来,一次性得出一个块的答案,把整块对答案的贡献加上即可。
那么怎么计算每个块的答案呢?
每个块都有一个头 和尾 。设有 个块,那么开始的问题可以被表示为 。 显然可以被表示为 ,所以只需要计算 即可。
给出一个结论: 对于整数 ,其所在块的右端点为 。
接下来我们来证明:
首先我们要证明 与 在同一块,也就是:
易证:
则:
所以:
我们还要证明:
也就是 是这个块内最大的,即为块的右端点,这个很好证明:
这样我们就以代数方式证明了结论。
接下来证明一下复杂度:
在 里,最多有 种取值。
在 里,显然也有 种取值。
复杂度为
引入题关键代码如下:
int r;
for(int l = 1;l <= n;l = r + 1){
r = n / (n / l);
ans += (r - l + 1) * (n / l);
}
例题
P15566
~
P2261
~
P3935
~
推荐练习题
AT_arc068_c、P13212、P4863
全部评论 8
突然发现好像爆字迹了()
2026-04-06 来自 北京
1电脑写的算啥字迹(
2026-04-09 来自 浙江
0平板写的
2026-04-09 来自 北京
0也不算吧,毕竟和手写的有差别
2026-04-09 来自 浙江
0
啥阴,不要再水无意味的东西了
2026-04-06 来自 广东
0你不喜欢数论就滚()
2026-04-06 来自 北京
0没东西写了硬写一个应用范围狭窄的算法还要加精?
2026-04-06 来自 广东
0不就一个证明和一堆使用吗,变体都没几个
2026-04-06 来自 广东
0
顶顶顶
2026-04-06 来自 广东
0考古
2026-04-05 来自 浙江
0n 考古 nmn
2026-04-06 来自 北京
0
orz
2026-04-05 来自 浙江
0值得加精
2026-04-05 来自 浙江
0ddd
dalao好厉害%%%2026-04-05 来自 浙江
0qp
2026-04-05 来自 北京
0






























有帮助,赞一个