整除分块学习笔记

模型

i=1nni

假设 n 等于 10,我们可以列出下表:

 i 1 2 3 4 5 6 7 8 9 10
10i 10 5 3 2 2 1 1 1 1 1

如果我们的 n 更大时,我们可以发现 10i 中有许多重复的地方。

我们可以将相同的分为一块,这样可以发现块不会超过 2n 个。

证明
我们设当前块的值为 m
mn 时,nm 总共的个数,不会超过 m 的个数,因此最多有 n 个块。
m>n 时,nm 的取值应该在 [1,n] 之间,因此也最多有 n 个块。

综上,块的个数不超过 2n

推导

我们需要找到每个块的左右端点,设我们已知这个块的左端点 l,则考虑怎么找到右端点 r

设这个块的值为 x,那么对于块中的每个数 i,则有 x=nl=ni

那么 r=max(i),因为 i×xn,我们可以设 i×x=n 以此来找到最大的 r

r=nx=nn/l

下一个块的 l 就应该是 r+1

变形

first.

i=1min(n,m)nimi

x1=ni,x2=mi

则有 i×x1n,i×x2m

r=max(i),所以 r=min(nn/l,mm/l)

second.

已知 f(i)i 的约数个数,求 i=1nf(i)
题目来源:P1403 [AHOI2005] 约数研究

我们直接计算每个数的约数个数显然会超时,那么我们不妨枚举每个约数的个数。

显然的 in 中的贡献即是:ni

那么问题就转换为了:求 i=1nni

整除分块即可。

trird.

已知 a,b,n,求 i=1nnai+b

考虑换元,设 g=ai+b

还是一样的,则对 ng 做整除分块。

x=ng,则有 i×gn

r=max(i),所以 r=nx=nng=nnal+b

对于 g=ai+br=max(g)

则可以推出 i=gba,r=max(i)=max(gba)=max(rba)

所以 r=nnal+bba

posted @   bhbjzyh  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示