数论分块/整除分块简单应用

在解释用途之前,我们要证明一个东西,在 l 一定时,使

lrn,nl=nr

满足的最大的 rnnl

先翻译一下:对于一个块内值为 p=nl,则块的右端点最大为 np

Proof.
考虑对于这个块内的每个 x 都有 nx=p,则 n=px+q(0q<n),所以 npxxnp,又因为 x 为整数,所以 maxx=np

整理一下我们得到了什么:对于 l,我们知道了最大的 r,也知道了这一段的某个相同的值,是不是就可以求和了呢?实际上这也就是其主要应用之一。

【例题 1】UVA11526:

i=1nni

应用上面的结论,可以得到每一段和每一段的值,直接求和即可。

for(int l=1,r;l<=n;l=r+1){
   r = min(n,n/(n/l));
   sum += (r-l+1) * (n/l);
}

代码非常简单。

但是我们还不知道它为什么是对的。换句话说,我们需要证明其复杂度,显然看到“分块”,你可以估测其复杂度为根号级别。

我们考虑 ni 的取值,当 in 时,显然 ni 至多有 n 个取值。当 in 时,nin,显然也只有 n 个取值。所以总取值至多在 2n,所以复杂度为 n 级别,但是注意到这东西有一个 2 的常数,所以数论分块的常数是略大的。

【例题 2】P2261 [CQOI2007] 余数求和:

i=1nkmodi

i=1nkmodi=i=1n(kiki)=i=1nki=1n(iki)=nki=1n(iki)

我们考虑计算后面的式子,此时对于 lr 这一段,贡献为 i=lriki,我们可以两个分别求和再相乘。

前面显然是一个等差数列求和,后面直接整除分块做即可。

注意一个 corner case,n>k 时,有除数为 0 需要特判。

由此可见,数论分块能处理的问题还能拓展到求 i=1nf(i)ni 的问题。

【例题 3】P3935 Calculating:

这题能给我们一个重要的结论。

首先意识到 f(i) 就是 i 的因数个数。显然我们只要求出 i=1nf(i) 就能求出答案。

这个东西怎么求呢?你可以先看一下 P1403 [AHOI2005] 约数研究。发现:
i=1nf(i)=i=1nni

大概解释一下,对于 1 ,会作为每个 n=1k 的数的因数,对于 2 ,会作为每个 n=2k 的数的因数,总共有 n2 个这样的数字。依次类推。

然后可以用数论分块解决。

【二维整除分块】P2260 [清华集训2012] 模积和:

首先容斥一下,把 i=j 的在最后减掉即可。

i=1nj=1m(nmodi)×(mmodj)=i=1n(nini)×j=1m(mjmj)

显然可以数论分块,但是不要忘记还要容斥减掉 i=j 的情况,考虑那个怎么算,不妨假设 nm

i=1n(nmodi)×(mmodi)=i=1n(nini)×(mimi)=i=1nnmnimimini+i2nimi

前三项显然平凡,直接数论分块即可,考虑计算 i=1ni2nimi,这是一个多维的整除分块,我们不妨先看看去掉 i2 后怎么做。

想想我们到底是按什么在分块?是值相同,那么假设当前的 l 是确定的,也就是说 ri 是确定的,那么我如果要能够把这些项一起算,也就是说要找出最大的 r 使得其对所有数都成立,显然,R=minri这个结论也可以拓展到多维

然后平凡。考虑加上 i2 项,我们发现 i=1ni2=n(n+1)(2n+1)6,于是计算区间的平方和也显然。

给出代码实现:

for(int l=1,r=n;l<=n;l=r+1){
   r = min(n/(n/l),m/(m/l));
   sum+=(f(r)-f(l-1)) * (n/l) * (m/l);
}

实际上,结合莫比乌斯反演,整除分块还有很大的应用空间。

作者:紊莫

出处:https://www.cnblogs.com/wenmoor/p/17980900

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   紊莫  阅读(21)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题