定义
数论分块是个很常见的技巧,常用于计算$$\sum_{i=1}^{n} \left[\frac{k}{i} \right] $$
思路
原理很简单:设\(t_i \in\{x|x=\left[\frac{k}{i}\right]\}\)我们想办法每次计算出一个\(t_i\)的贡献,即一次求出一个\(\left[\frac{k}{i} \right]\)的值对答案的贡献,这样复杂库大约是\(O(log(n))\)
代码
代码实现是很简单的,这里是实现$$\sum_{i=1}^{n}\text{k%i}=\text{n*k-} \sum_{i=1}^{n} i*\left[\frac{k}{i} \right] = ans$$的计算的示例
int anss=0;
cin>>n>>k;
anss+=n*k;
int r;
for(int l=1;l<=n;l=r+1){
t=k/l;
if(t==0)
break;
r=min(n,k/t);
anss-=(r+l)*(r-l+1)/2*t;
}
cout<<anss;
标签:right,frac,分块,数论,sum,int,除法,left
From: https://www.cnblogs.com/WXk-k/p/17065993.html