数论分块小结

概念

下面除法皆表示整除

求:

i=1nni

显然,暴力 O(n),但有很多结果是相同的,所以可以分段每一段分别处理,大概有 n

令这一段的左端点(最小值)为 l,设 k=nl,我们要找一个最大值 r 满足 nr=k,显然 r=nnl,则 [l,r] 的和为 nl×(rl+1)

例1 P2261 [CQOI2007]余数求和

数论分块

下面除法默认下取整

G(n,k)=i=1nkmodi=i=1n(kki×i)=n×ki=1ni×ki

显然,对于 ki 必然是很多段连续的数组成,所以可以分块处理,也就是数论分块。

设当前这一块左端点为 l,结果为 a=kl,则 r=kl=kkl,前面乘 i 可以直接套等差数列求和公式。

时间复杂度 O(k)

例2 牛客网235422 区间最大值

以下分数皆表示整除

max(nmodi)=max(nni×i)=n+max(ni×i)=nmin(ni×i)

显然,当 ni 一定时,i 越小越好,所以可以把每个 ni 求出来,然后数列分块取最小值即可

例3 P3935 Calculating

显然,f(x) 就是 x 的因数个数。

S(n)=i=1nf(i),所以答案在求 S(r)S(l1)

对于任意 i[1,n],它作为小于等于 n 的数的约数个数为 ni(向下取整),于是 S(n)=i=1nni

观察上式,S(n) 显然可以通过数论分块在 O(n) 的时间求出。

总时间复杂度 O(r)

例4 牛客网NC13221数码

显然数论分块

然后统计一下每一块内1到9出现的情况乘上 n/l 即可

例5 P2260 [清华集训2012]模积和

nm

i=1n(nmodi)×j=1m(mmodj)i=1n(nmodi)(mmodi)

前面那两坨就是个数论分块板子,后面那块拆一下:

i=1n(nmmi×inni×im+mi×ni×i2)

这里还是可以数论分块,每次块的 r 可以取 min(ml,nl)

然后还有几个难点

  1. 后面那坨鬼东西乘 i2,众所周知二次方和公式 i=1ni2=n(n+1)(2n+1)6

  2. 然后上面那个鬼公式因为上面三个乘起来会爆所以要用逆元

  3. 然后因为↑↓出题人模数不是质数不能用费马只能老老实实打拓欧

posted @   zhangtingxi  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示