数论分块

数论分块

数论分块

也叫整除分块

是用于快速处理类似于

i=1nni或者i=1nni

式子的一种方法

复杂度:O(n)

思想阐述:以向下取整为例

对于ni,来说,它的值是呈块状递减分布的,至多有2n个块

这些块的分布规律是:

对于一个块内的一个点l,我们可以得到块的右端点为nni

写成代码就是

int get(int l){return n/(n/l);}

非常的so  easy

那么我们要求的 i=1nni

也就迎刃而解了

for(int i=1;i<=n;i++){
   int r=get(i);
   ans+=(n/i)*(r-i+1);
   i=r;
}

还有一个性质:

对于a,b,cZ,有abc=abc

来一道例题吧:

余数之和(CQOI2007)

题意简述:给定n,k求:

i=1n(kmodi)

注意到kmodi=kki×i

所以

i=1n(kmodi)=i=1n(kki×i)=i=1nki=1nki×i=n×ki=1nki×i

由于数论分块,我们设i=1nki分成了m个块,各个块的左右端点记作Li,Ri(i[1,m])

则原式子可化为:

i=1mj=LiRi(kLi×j)=i=1m(kLi×j=LiRij)=i=1m(kLi×(Li+Ri)(RiLi+1)2)

综上所述,答案即为:

n×ki=1m(kLi×(Li+Ri)(RiLi+1)2)

Code:

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